首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java泛型和数组初始化

Java泛型和数组初始化
EN

Stack Overflow用户
提问于 2009-01-22 17:58:17
回答 3查看 5.8K关注 0票数 18

下面的解释是什么:

代码语言:javascript
复制
public class GenericsTest {
    //statement 1
    public ArrayList<Integer>[] lists;

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

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

我看到的关于不允许泛型数组的一个很好的解释是this one,他认为既然数组是协变的,而泛型不是协变的,那么如果允许泛型数组,就可以颠覆泛型类型。

抛开关于语言是否应该在处理泛型的过程中创造这种复杂的不一致性的极端长度的争论,无论你多么努力,都不会射杀你自己(如果有人知道关于这个问题的相对优点/缺点的任何很好的讨论,请发表,我很有兴趣看看这些争论),如果(2)不允许,为什么语句(1)应该被允许?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-22 18:24:40

似乎有一些模糊的情况,您可能会无意中导致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

票数 1
EN

Stack Overflow用户

发布于 2009-01-23 01:04:06

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

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

在某些情况下,您可能希望使用未经检查的强制转换来稍微改变规则。没有必要强迫代码中充斥着超过必要的警告抑制(除了指出愚蠢之外)。

票数 0
EN

Stack Overflow用户

发布于 2009-01-22 20:59:56

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

代码语言:javascript
复制
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 []语法。除此之外,它是等效的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/470198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档