Java泛型和数组初始化

标签 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)?

最佳答案

这是因为你不能创造,但你可以使用它们:

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/

相关文章:

java - 尝试使用 DateTimeFormatter 解析时间

java - Clojure 中的无符号 16 位整数

javascript - 不断向后移动数组

java - Java 11 中使用泛型进行未经检查的方法 'sort(List<T>)' 调用

c# - 可变长度参数 c#

generics - 我如何为另一个泛型类型的特征绑定(bind)表达类型参数的特征绑定(bind)?

java - DateUtils.parseDate 不会在无效日期上抛出 ParseException

java - 使用 Jframe 显示新对话时如何清除显示?

arrays - 为什么在数组扩展中使用 Stride 非法创建临时数组

c++ - 将二维数组传递给函数