在某些情況下,即使某個對象不是數組的基類型,我們也可以把它賦值給數組元素。這種屬性叫做協變(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)
所以要合理的使用數組的協變
