下面的解释是什么:
public class GenericsTest {
//statement 1
public ArrayList<Integer>[] lists;
public GenericsTest()
{
//statement 2
lists = new ArrayList<Integer>[4];
}
}
编译器接受语句1。语句2被编译器标记为“泛型数组创建”。
我看到的关于不允许泛型数组的一个很好的解释是this one,他认为既然数组是协变的,而泛型不是协变的,那么如果允许泛型数组,就可以颠覆泛型类型。
抛开关于语言是否应该在处理泛型的过程中创造这种复杂的不一致性的极端长度的争论,无论你多么努力,都不会射杀你自己(如果有人知道关于这个问题的相对优点/缺点的任何很好的讨论,请发表,我很有兴趣看看这些争论),如果(2)不允许,为什么语句(1)应该被允许?
发布于 2009-01-22 18:24:40
似乎有一些模糊的情况,您可能会无意中导致ClassCastException,就像这里解释的http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf (7.3节)
关于这个话题的有趣讨论可以在这里找到http://courses.csail.mit.edu/6.170/old-www/2006-Spring/forum/index.php%3Ftopic=324.msg1131.html
发布于 2009-01-23 01:04:06
所以实际的问题是:为什么声明泛型数组没有错误?
当你做了一些错误的事情时,你总是会得到一个错误。在技术上没有问题的地方添加错误只会增加混乱(尽管编辑器可能会向您指出这一点)。
在某些情况下,您可能希望使用未经检查的强制转换来稍微改变规则。没有必要强迫代码中充斥着超过必要的警告抑制(除了指出愚蠢之外)。
发布于 2009-01-22 20:59:56
在这种情况下,我会出于这个原因避免使用数组。在原始代码中“list”的声明可以是
List<List<Integer>> lists = new ArrayList<List<Integer>>(4);
for(int i = 0; i < 4; i++) lists.add(null); // or add an empty ArrayList<Integer>
(您应该在变量声明中使用接口而不是实现)
您可以使用get()或set()来代替array []语法。除此之外,它是等效的。
https://stackoverflow.com/questions/470198
复制相似问题