为什么Java泛型不能放在数组中?


Answers:


20

这是Java泛型的主要漏洞之一,数组是协变的,这意味着类型的数组Foo[]Object[]and 的子类ParentOfFoo[]。将List<Foo>其与没有这种行为的对比。

当Java没有泛型(直到Java 5)时,这一点很重要,因为否则,像泛型排序功能之类的事情就不可能实现。

但是,存在一个棘手的问题,即数组喜欢在运行时知道它们的类型。但是,Java中的泛型基于类型擦除。这两件事根本无法很好地融合在一起,这就是我们遇到的问题。

因此,长话短说是,在Java 1中,协变量数组部分填补了缺少泛型所造成的漏洞。但是,当他们试图适当地填补这个漏洞时,向后兼容意味着几乎不可能实现数组。

实际上,实际上是创建泛型框架的人Martin Odersky 在接受采访时谈到了为何制作Scala时谈到了这一点。(如果您对Scala的历史完全感兴趣,那将非常有趣)


3

是否有与Java的泛型实现,任何语言的泛型或任意形式有关的原因?

实际上,这有点武断。

问题在于,它可以在类型系统中允许一个孔,因为ArrayList<T>[]可以将其强制转换为Object[],然后可以ArrayList<U>在其中的数组中放置U != T

Java设计者决定通过完全不允许这样做来尽可能地阻止此漏洞new ArrayList<T>[N]

但是,也可以通过不允许向上泛型数组的插入(没有“未经检查”的警告)将其插入。


这个答案被低估了。非常简单,不使用含糊的术语。非常感谢。
东阮

您可能需要详细说明为什么这与您将a Integer放入Object[]实际上是a 的情况不同String[]
Caleth

-3

因为数组是协变的,每种类型都是对象的子类,所以由于强制转换异常,在运行时会产生错误。虽然泛型是不变的,所以当它基于类型确保或类型安全时,因此如果类型不像它创建类型,则会产生编译器错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.