协变数组子类型和多态数组

时间:2013-10-19 06:21:16

标签: java arrays polymorphism covariance

在Java协变数组子类型中意味着如果AB的子类型,则A[]被视为B[]的子类型。我读到协变数组子类型是一个糟糕的设计选择,而多态数组是正确的设计选择。但多态数组究竟意味着什么呢?

1 个答案:

答案 0 :(得分:0)

正如@Bhesh Gurung在他的评论中所指出的, array 协方差与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]