Java 泛型和数组初始化

2022-09-02 22:35:54

对以下内容的解释是什么:

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

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

编译器接受语句 1。编译器将语句 2 标记为“创建泛型数组”。

我看到的关于不允许泛型数组的一个很好的解释是这个,它认为由于数组是协变的,而泛型不是,如果你允许泛型数组,你可以颠覆泛型类型。

撇开关于语言是否应该在通用码的处理中造成这种复杂的不一致的极端争论,以防止你开枪自杀,无论你多么努力(如果有人知道关于这个问题的相对优点/缺点的任何良好讨论,请发布, 我有兴趣看看参数),如果(2)不是,为什么语句(1)应该被允许?


答案 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 将导致编译器错误。


答案 2

似乎有一些晦涩难懂的情况,您可能会无意中引起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