Java 协变数组子类型和多态数组
在Java中,协变数组子类型表示如果Java 协变数组子类型和多态数组,java,arrays,polymorphism,covariance,Java,Arrays,Polymorphism,Covariance,在Java中,协变数组子类型表示如果A是B的子类型,则A[]被视为B[]的子类型。我读到协变数组子类型是一个糟糕的设计选择,而多态数组是正确的设计选择。但是多态数组到底意味着什么呢?正如@Bhesh Gurung在他的评论中指出的那样,数组协方差与List等泛型类无关。数组协方差意味着如果类B扩展类A,则类型B[]可分配给A[] 他们在Java中这样做的原因是,在向Java添加泛型之前,允许像这样的方法返回。基本上,他们想要一种方法,该方法采用对象[]来接受任何类型的数组。这是一个错误的选择,因
A
是B
的子类型,则A[]
被视为B[]
的子类型。我读到协变数组子类型是一个糟糕的设计选择,而多态数组是正确的设计选择。但是多态数组到底意味着什么呢?正如@Bhesh Gurung在他的评论中指出的那样,数组协方差与List
等泛型类无关。数组协方差意味着如果类B
扩展类A
,则类型B[]
可分配给A[]
他们在Java中这样做的原因是,在向Java添加泛型之前,允许像这样的方法返回。基本上,他们想要一种方法,该方法采用对象[]
来接受任何类型的数组。这是一个错误的选择,因为它可能导致运行时类型错误。例如:
Object[] objs = (Object[]) new Integer[1];
objs[0] = "Hello"; // Compiles, but throws runtime error
多态数组类似于Scala语言中数组的工作方式。您可以执行类似于
新数组(10)
的操作,而不是声明新整数[10]
。我认为这可能更可取,因为它可以让您执行诸如初始化泛型类型的数组或创建泛型类型的数组之类的操作。例如,新列表[10]
A
s的数组是A[]
notList
。