java 数组协变


在某些情况下,即使某个对象不是数组的基类型,我们也可以把它赋值给数组元素。这种属性叫做协变(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)

所以要合理的使用数组的协变

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM