Answers:
这是Java泛型的主要漏洞之一,数组是协变的,这意味着类型的数组Foo[]
是Object[]
and 的子类ParentOfFoo[]
。将List<Foo>
其与没有这种行为的对比。
当Java没有泛型(直到Java 5)时,这一点很重要,因为否则,像泛型排序功能之类的事情就不可能实现。
但是,存在一个棘手的问题,即数组喜欢在运行时知道它们的类型。但是,Java中的泛型基于类型擦除。这两件事根本无法很好地融合在一起,这就是我们遇到的问题。
因此,长话短说是,在Java 1中,协变量数组部分填补了缺少泛型所造成的漏洞。但是,当他们试图适当地填补这个漏洞时,向后兼容意味着几乎不可能实现数组。
实际上,实际上是创建泛型框架的人Martin Odersky 在接受采访时谈到了为何制作Scala时谈到了这一点。(如果您对Scala的历史完全感兴趣,那将非常有趣)
是否有与Java的泛型实现,任何语言的泛型或任意形式有关的原因?
实际上,这有点武断。
问题在于,它可以在类型系统中允许一个孔,因为ArrayList<T>[]
可以将其强制转换为Object[]
,然后可以ArrayList<U>
在其中的数组中放置U != T
。
Java设计者决定通过完全不允许这样做来尽可能地阻止此漏洞new ArrayList<T>[N]
。
但是,也可以通过不允许向上泛型数组的插入(没有“未经检查”的警告)将其插入。
Integer
放入Object[]
实际上是a 的情况不同String[]