结论:泛型Generic规定了容器所能装的类型。子类泛型不能转父类泛型,父类泛型也不能转子类泛型
回顾一下对象的转型,在对象的层面,子类转父类是一定可以的,父类转子类也可以采用强制转换,但是后果自负。
先看看泛型是否能转型:
package collection;
import java.util.ArrayList;
public class Fruit {
public static void main(String[] args) {
ArrayList<Fruit> f = new ArrayList<>();
ArrayList<Apple> a = new ArrayList<>();
//子类转父类:
f = a;//报错
//父类转子类
a = f;//报错
}
}
为什么泛型不能转型呢?个人理解是,像子类转父类f = a, 水果容器f变成指向了苹果容器,再也装不下其他水果了,也就是容器变小了,这当然不行;而父类转子类a = f, 苹果容器a变成指向了水果容器,也就是容器变大了,竟然能装其他水果而不是只能装苹果了,这显然也是不合理的。
再回头看看对象转型:
package collection;
public class Fruit {
public static void main(String[] args) {
Fruit f = new Fruit();
Apple a = new Apple();
//子类转父类:
f = a;
//父类强转子类
a = (Apple) f;
}
}
造成“对象可转型,而泛型不可转型”的区别的原因,我个人理解,是因为容器是有一个范畴在的,而对象并没有一个范畴,也就是说,f指向苹果之后(子类转父类f = a),这个f就是一个苹果了,不用担心其它的了,这个f又不用像容器那样还要装其它的东西;而a指向水果之后(父类强转子类a = (Apple) f),这个a就是一个水果了(当然转的时候要声明它是苹果,也就是强转的意义),不用担心其它的了,这个a又不用像容器那样还要装其它的东西。但是我猜a实质上还是一个苹果,只是名义上可以说成是一个水果罢了。