泛型
2018-04-03 本文已影响63人
battle_
Fruit <- Apple
Fruit <- Orange
Fruit[] f = new Apple[10];
f[0] = new Apple();
f[1] = new Orange();
以上编译阶段都不会报错。
但是运行阶段数组new的是Apple,JVM就认为数组类型为Apple类型,所以添加其他的Fruit就会出现运行错误java.lang.ArrayStoreException
泛型目的之一就是要在编译期让错误抛出,而不是等到运行期才知道错误。
泛型通过限定通配符来限制数组类型
List<? extends Fruit> f = Arrays.asList(new Apple());
extends限定通配符不能使用add方法,也就是不能新增item,因为编译器只知道list内存的是fruit的子类型,不知道add的是Fruit的哪种子类型,所以就禁止使用add。但是可以使用get方法获取item的向上转型Fruit,Fruit就是该数组的上边界。
List<? super Fruit> f
super限定通配符不能使用get方法,可以使用add方法新增Fruit或其子类型,因为编译器只知道该list内类型为Fruit或其父类,可以使用add方法可以增加fruit及其子类型,因为在add过程中会向上转型成Fruit,而不能使用get方法,因为不知道get出的Obj到底是哪个子类型
java泛型使用类型擦除方法,类型只存在编译期,运行时,并不知道类型存在。