问题
Java不允许我们这样做的原因是什么
private T[] elements = new T[initialCapacity];
我可以理解.NET不允许我们这样做,因为在.NET中你有值类型,在运行时可以有不同的大小,但在Java中,所有类型的T将是对象引用,因此具有相同的大小(如我错了请纠正我)。
是什么原因?
#1 热门回答(168 赞)
这是因为Java的数组(与泛型不同)在运行时包含有关其组件类型的信息。因此,在创建阵列时必须知道组件类型。由于你不知道在运行时是什么T
,因此无法创建数组。
#2 热门回答(122 赞)
引用:
不允许使用泛型类型的数组,因为它们不是声音。问题是由于Java数组的交互,这些数组不是静态声音,而是动态检查的,使用泛型,这些泛型是静态的,不是动态检查的。以下是如何利用这个漏洞:class Box <T> {
最终T x;
方框(T x){
this.x = x;
}
}
漏洞{
public static void main(String [] args){
Box <String> [] bsa = new Box <String> [3];
对象[] oa = bsa;
oa [0] =新Box <整数>(3); //错误未被数组存储检查捕获
String s = bsa [0] .x; // BOOM!
}
}
我们曾提议使用被Tiger拒绝的静态安全阵列(又名Variance)来解决这个问题。 - gafter
(我相信它是Neal Gafter,但我不确定)
请在此处查看:http://forums.sun.com/thread.jspa?threadID=457033&forumID=316
#3 热门回答(36 赞)
由于未能提供合适的解决方案,你最终会得到更糟糕的恕我直言。
常见的工作如下。
T[] ts = new T[n];
被替换为(假设T扩展Object而不是另一个类)
T[] ts = (T[]) new Object[n];
我更喜欢第一个例子,但是更多的acedemic类型似乎更喜欢第二个,或者只是不喜欢它。
大多数为什么你不能只使用Object []的例子同样适用于List或Collection(支持),所以我认为它们是非常差的参数。
注意:这是Collections库本身无法在没有警告的情况下编译的原因之一。如果你在没有警告的情况下无法支持这个用例,那么使用泛型模型恕我直言就可以解决这个问题。