在某些情况下,即使某个对象不是数组的基类型,我们也可以把它赋值给数组元素。这种属性叫做协变(covariance)。在下面的情况下可以使用协变:
数组是引用类型数组。
在赋值的对象类型和数组基类型之间有隐式转换或显式转换。
由于在派生类和基类之间总是有隐式转换的,因此总是可以将一个派生类的对象赋值给为基类声明的数组。
只有数组存在协变,此功能有利也有弊,相对于List 是支持泛型 不支持协变
class A{
}
class B extends A{
}
A[] array = new B[10];
A[] array = new A[10];
array[0] = new B();
此种创建数组 或者赋值成功即为数组的协变原因
对于List
List<A> list = new ArrayList<B>();(编译失败,泛型)
正是因为数组支持协变,也就导致存在下面的隐患
Object[] array = new Integer[10];
array[0] = "s String";
编译正常
运行则报异常
Exception in thread "main" java.lang.ArrayStoreException: java.lang.String
at com.me.test.Main.main(Main.java:9)
所以要合理的使用数组的协变
时间: 2024-11-10 01:13:45