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