Java泛型和数组初始化

Ste*_* B. 18 java arrays generics

以下是什么解释:

public class GenericsTest {
    //statement 1
    public ArrayList<Integer>[] lists;

    public GenericsTest()
    {
            //statement 2
        lists = new ArrayList<Integer>[4];
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器接受语句1.语句2由编译器标记为"通用数组创建".

我已经看到一个关于禁止泛型数组的一个很好的解释是这个,认为由于数组是协变的,而泛型不是你可以破坏泛型类型,如果你允许泛型数组.

撇开关于这种语言是否应该极端地在泛型的处理方面造成这种复杂的不一致性的争论,无论你怎么努力都不让自己开枪(如果有人知道关于亲戚的任何好的讨论)问题的优点/缺点请发帖,我有兴趣看看论点),如果(2)不是,为什么要声明(1)?

Sve*_*hal 6

这是因为你无法创建,但你可以使用它们:

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(""));
    }
}
Run Code Online (Sandbox Code Playgroud)

语句3是可能的,语句4将导致编译器错误.


use*_*579 1

似乎在一些晦涩的情况下,您可能会无意中导致 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