3 回答

TA贡献1934条经验 获得超2个赞
好吧,泛型教程为您的问题提供了答案。
数组对象的组件类型不能是类型变量或参数化类型,除非它是(无界)通配符类型。您可以声明其元素类型是类型变量或参数化类型的数组类型,但不能声明数组对象。
当然,这很烦人。为避免出现以下情况,必须使用此限制:
// Not really allowed.
List<String>[] lsa = new List<String>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Unsound, but passes run time store check
oa[1] = li;
// Run-time error: ClassCastException.
String s = lsa[1].get(0);
如果允许使用参数化类型的数组,则前面的示例将在编译时没有任何未经检查的警告,但在运行时会失败。我们已经将类型安全性作为泛型的主要设计目标。

TA贡献1802条经验 获得超10个赞
通常,您不能创建泛型类型的数组。
其原因是,在JVM有没有办法检查,只有正确的对象放入它(与ArrayStoreExceptions),因为之间的差异List<String>
,并List<Integer>
在运行时不存在的。
当然,您可以使用原始类型List
或未绑定的通配符类型来欺骗编译器List<?>
,然后将其(使用未经检查的类型转换)转换为List<String>
。但是,您有责任仅将其放在List<String>
其中,而不能放入其他列表。
添加回答
举报