这一章节我们继续类型擦除的话题,我们将通过对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题?
1.数组
package com.ray.ch13; public class Test { public static void main(String[] args) { Fruit[] fruits = new Apple[5]; fruits[0] = new Apple(); fruits[1] = new Fuji(); fruits[2] = new Fruit(); } } class Fruit { } class Apple extends Fruit { } class Fuji extends Apple { }
2.泛型容器
一般用法:
package com.ray.ch13; import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<Fruit> fruits = new ArrayList<Fruit>(); fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Fuji()); } } class Fruit { } class Apple extends Fruit { } class Fuji extends Apple { }
但是,我们下面将根据向上转型的特性,看看能不能像数组一样?
例子:
package com.ray.ch13; import java.util.ArrayList; public class Test { public static void main(String[] args) { // ArrayList<Fruit> fruits = new ArrayList<Apple>();//error ArrayList<? extends Fruit> fruits = new ArrayList<Apple>(); // fruits.add(new Apple());//error // fruits.add(new Fruit());//error fruits.add(null);// 这里只能是null,没有其他选择 } } class Fruit { } class Apple extends Fruit { } class Fuji extends Apple { }
总的来说,因为数组是完全定义,在编译器和运行期都会进行类型检测,或者说数组本身就是持有对象,而泛型容器只是在编译器检查类型安全,而在运行期全是Object,只是半定义,或者说泛型容器不持有对象,才导致上面所展示的问题。
总结:这一章节我们主要对比数组与泛型容器,观察类型擦除给泛型容器带来什么问题。
这一章节就到这里,谢谢。
-----------------------------------
目录