0
在Java协变阵列中,子类型化意味着如果A
是B
的子类型,则A[]
被认为是B[]
的子类型。我读到covariant数组分类是一个糟糕的设计选择,相反,多态数组是正确的设计选择。但是多态阵列究竟意味着什么?协变阵列子类型和多态阵列
在Java协变阵列中,子类型化意味着如果A
是B
的子类型,则A[]
被认为是B[]
的子类型。我读到covariant数组分类是一个糟糕的设计选择,相反,多态数组是正确的设计选择。但是多态阵列究竟意味着什么?协变阵列子类型和多态阵列
As @Bhesh Gurung在他的评论中指出,数组协变与泛型类如List<T>
无关。阵列协方差意味着如果类B
扩展类A
,则类型B[]
可指定为A[]
。
他们在Java中这样做的原因是为了允许诸如Arrays.equals(Object[], Object[])
之类的方法在将泛型添加到Java之前回退。基本上,他们想要一种方法,它需要一个Object[]
能够接受任何类型的数组。这是一个不好的选择,因为它会导致运行时类型错误。例如:
Object[] objs = (Object[]) new Integer[1];
objs[0] = "Hello"; // Compiles, but throws runtime error
一个多态数组就像数组在Scala语言中的工作方式。您不需要声明new Integer[10]
,而是可以执行类似new Array<Integer>(10)
的操作。我认为这可能是可取的,因为它可以让你做像初始化泛型类型的数组,或者使用泛型类型创建数组的东西。例如,new List<String>[10]
。
“A”的数组是“A []”而不是“列表”。 –
哦,你修好了。 – user782220