首页 >Java >java教程 >为什么在 Java 中使用原始类型和泛型方法会导致类型错误?

为什么在 Java 中使用原始类型和泛型方法会导致类型错误?

Patricia Arquette
Patricia Arquette原创
2024-11-12 00:10:03678浏览

Why does using raw types with generic methods lead to type errors in Java?

结合原始类型和泛型方法

在 Java 中使用泛型时,了解使用原始类型的含义非常重要。原始类型只是对没有指定任何类型参数的泛型类型的引用。

问题

考虑以下代码:

ArrayList<String> a = new ArrayList<>();
String[] s = a.toArray(new String[0]);

此代码编译成功,因为 toArray 是一个接受 类型数组的泛型方法。作为其论点。但是,如果将 ArrayList 引用声明为原始类型:

ArrayList a = new ArrayList();
String[] s = a.toArray(new String[0]);

编译器将生成错误,指示需要 String[],但找到了 Object[]。这是因为编译器将泛型方法解释为返回 Object[],尽管接收 String[] 作为其参数。

理解原始类型

要理解这种行为,需要认识到当您使用原始类型时,您将失去指定类型参数的能力,这一点至关重要。 Java 语言规范 (JLS) 规定,对于原始类型:

“原始类型 C 的构造函数、实例方法或非静态字段 M 的类型,不是从其超类或超接口继承的是原始类型,对应于与 C 相对应的泛型声明中其类型的擦除。”

换句话说,原始类型中的所有泛型方法和字段都被视为使用原始类型本身。

泛型方法的含义

这意味着当您使用原始类型作为泛型方法调用的目标时,编译器无法推断出该类型方法的参数。因此,该方法将被假定为仅在参数的类型参数上是通用的。在我们的例子中,由于我们传递了 String[] 参数,因此 toArray 方法被视为 。因此,返回类型将为 T[],相当于 String[]。

进一步阅读参考文献

  • [JLS 4.8: Raw类型](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.8)
  • [Java 教程:泛型](https:// /docs.oracle.com/javase/tutorial/java/generics/)

以上是为什么在 Java 中使用原始类型和泛型方法会导致类型错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn