【问题标题】:Java generics and array initializationJava 泛型和数组初始化
【发布时间】:2010-10-02 23:33:38
【问题描述】:

下面的解释是什么:

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

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

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

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

撇开关于语言是否应该竭尽全力在泛型处理中制造这种复杂的不一致的争论,以防止您无论多么努力都不会开枪(如果有人知道任何好的讨论)关于问题的相对优点/缺点,请发布,我有兴趣查看论点),如果(2)不是,为什么要允许声明(1)?

【问题讨论】:

    标签: java arrays generics


    【解决方案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 会导致编译器错误。

    【讨论】:

    • 语句 4 确实给出了一个错误,但语句 2 给出了一个“未经检查的转换”警告,这是值得的。
    • 实际上,我认为语句 3 的行为是不确定的,因为您还没有执行“lists[0] = new ArrayList();”首先...
    • 嗯,好声音。该示例实际上可以编译(如果您省略语句 4),但我还没有运行它。语句 3 将导致 RuntimeException。
    【解决方案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

    【讨论】:

    • 很好的参考资料,谢谢。我认为,这一切都必须经历更多。
    【解决方案3】:

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

    你总是会在你做错事的时候得到一个错误。在技​​术上没有问题的地方添加错误只会增加混乱(尽管编辑可能想向您指出这一点)。

    在某些情况下,您可能想通过未经检查的演员来稍微改变规则。没有必要强制在代码中添加不必要的警告抑制(除了指出愚蠢之外)。

    【讨论】:

      【解决方案4】:

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

      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() 来代替数组 [] 语法。除此之外,它是等价的。

      【讨论】:

        猜你喜欢
        • 2014-04-05
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        • 2015-03-22
        • 1970-01-01
        • 2013-10-21
        相关资源
        最近更新 更多