下面的解释是什么:
public class GenericsTest {
//statement 1
public ArrayList<Integer>[] lists;
public GenericsTest()
{
//statement 2
lists = new ArrayList<Integer>[4];
}
}
编译器接受语句 1。编译器将语句 2 标记为“通用数组创建”。
我看到的关于禁止泛型数组的一个很好的解释是 this one ,认为由于数组是协变的而泛型不是协变的,所以如果允许泛型数组,则可以颠覆泛型类型。
抛开关于语言是否应该在泛型处理中制造这种复杂的不一致来防止你开枪自杀的极端长度的争论,无论你多么努力尝试(如果有人知道任何好的讨论关于这个问题的相对优点/缺点,请发表,我有兴趣看到论点),如果(2)不是,为什么应该允许陈述(1)?
最佳答案
这是因为你不能创造,但你可以使用它们:
public class GenericsTest {
//statement 1
public ArrayList<Integer>[] lists;
public GenericsTest()
{
//statement 2
lists = new ArrayList[4];
//statement 3
lists[0].add(new Integer(0));
//statement 4
lists[0].add(new String(""));
}
}
语句3是可能的,语句4会导致编译错误。
关于Java泛型和数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/470198/