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)

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

 

posted @ 2016-08-01 14:01  6小贝  阅读(2883)  评论(0编辑  收藏  举报