Java泛型和数组初始化

时间:2009-01-22 17:58:17

标签: java arrays generics

以下内容的解释是什么:

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

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

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

我见过关于禁止泛型数组的一个很好的解释是this one,认为由于数组是协变的而且泛型不是,如果你允许泛型数组,你就可以破坏泛型类型。

暂且不论这种语言是否应该极其严格地在仿制药的处理中造成这种复杂的不一致性,以防止你无论你怎么努力都不能射击自己(如果有人知道任何好的讨论)关于问题的相对优点/缺点,请发帖,我有兴趣看看论点),为什么如果(2)不是,是否应该允许声明(1)?

4 个答案:

答案 0 :(得分: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(""));
    }
}

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

答案 1 :(得分: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

答案 2 :(得分:0)

所以实际问题是:为什么声明泛型数组没有错误? ?

在你做错事的那一刻,你总会得到一个错误。在技​​术上没有问题的情况下添加错误只会增加混乱(尽管编辑可能想要指出这一点)。

在某些情况下,您可能希望使用未经检查的强制转换来略微修改规则。没有必要强制使用比必要更多的警告抑制来填充代码(除了指出愚蠢之外)。

答案 3 :(得分:-1)

在这种情况下,我会避免使用数组。原始代码中的“列表”声明可以是

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 []语法。除此之外,它是等价的。