共变数组和类型擦除
数组的共变性,也称为协变性
数组的共变性(covariant)是指:如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类
数组的共变性可能会导致一些错误,比如下面的代码:
public static void main(String[] args) {
Object[] array = new String[10];
array[0] = 10;
}
它是可以编译通过的,因为数组是共变的,Object[]类型的引用可以指向一个String[]类型的对象
但是运行的时候是会报出如下异常的:
Exception in thread “main” java.lang.ArrayStoreException: java.lang.Integer
集合不具有共変性
所以集合可以使用泛型避免上述错误:
public static void main(String[] args) {
List< Object> list = new ArrayList< String>();
list.add(10);
}
这段代码无法通过编译
数组的具体化
数组是具体化的(reified),而泛型只在编译时有效,在运行时会被擦除(erasure)
数组在运行时才去判断数组元素的类型约束,而泛型正好相反,在运行时,泛型的类型信息会被擦除,只在编译时对类型进行强化