gpt4 book ai didi

java - 结合原始类型和泛型方法

转载 作者:行者123 更新时间:2023-12-04 11:25:43 26 4
gpt4 key购买 nike

这里有一个问题,第一个代码 list 编译得很好(JDK 1.6 | JDK 1.7):

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

但是,如果我声明 List作为原始类型的引用:

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

我收到一个编译器错误,提示 String[]是必需的,但 Object[]被找到。

这意味着我的编译器将泛型方法解释为返回 Object[]尽管收到 String[]作为它的论点。

我仔细检查了 toArray(myArray)方法签名:

<T> T[] toArray(T[] a);

因此它是一个参数化方法,其类型参数为<T>与列表(即 <E> )没有任何关系。

我不知道在这里使用原始类型如何影响使用独立类型参数的参数化方法的评估。

  • 有谁知道为什么这段代码无法编译?
  • 是否有人知道记录此行为的任何引用资料?

最佳答案

这并不完全是您所期望的,但是如果您引用原始形式的泛型类,您将失去以任何方式为实例成员使用泛型的能力。它也不限于泛型方法,看看这个:

 public class MyContainer<T> {

public List<String> strings() {
return Arrays.asList("a", "b");
}
}

MyContainer container = new MyContainer<Integer>();
List<String> strings = container.strings(); //gives unchecked warning!

这是 JLS 的相关部分(4.8):

The type of a constructor (§8.8), instance method (§8.4, §9.4), or non-static field (§8.3) M of a raw type C that is not inherited from its superclasses or superinterfaces is the raw type that corresponds to the erasure of its type in the generic declaration corresponding to C.

关于java - 结合原始类型和泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33062582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com