以下是一个问题,这段代码在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>
与List的类型参数(即<E>
)没有任何关系。我不知道在此处使用原始类型如何影响使用独立类型参数的参数化方法的评估。
- 有人知道为什么这段代码无法编译吗?
- 有人知道任何记录了此行为的参考资料吗?
(String[])a.toArray();
,由于您没有使用泛型,所以必须进行强制转换。 - Hovercraft Full Of EelsArrayList<?> a = new ArrayList();
,错误就会消失。此外,如果使用Integer
作为类型:ArrayList<Integer> a = new ArrayList();
,错误也会消失。 - creemamaE
会影响参数化方法中的类型参数T
。 - Edwin Dalorzo