两个问题
问题一:FatherClass和ChildClass是父子类的关系,那List<FatherClass>和List<ChildClass>是否也是父子类的关系?
问题二:假使不是父子类关系,那么通过什么形式能够达到向上转型的成果?
有两个类Fruit和Apple,Apple继承自Fruit,所以Fruit使Apple的父类,关系如下图所示
示例代码
public class GenericMain { public static void method1(Fruit fruit) { System.out.println("lingyejun eat fruit"); } public static void method2(List<Fruit> fruitList) { System.out.println("lingyejun eat fruit list"); } public static void method3(Collection<Fruit> fruitList) { System.out.println("lingyejun eat fruit collection"); } public static void method4(List<? extends Fruit> fruitList) { System.out.println("lingyejun eat extends fruit list"); } public static void main(String[] args) { method1(new Fruit()); method1(new Apple()); List<Fruit> fruitList = new ArrayList<>(); fruitList.add(new Fruit()); method2(fruitList); List<Apple> appleList = new ArrayList<>(); appleList.add(new Apple()); method2(appleList);// Compile Error method3(fruitList);// 能够向Collection<Apple>中传入List<Apple> Set<Fruit> fruitSet = new HashSet<>(); method3(fruitSet);// 也能够向Collection<Apple>中传入Set<Apple> method4(fruitList); method4(appleList); }}
method1的办法参数是Fruit类型,想method1办法中传递Fruit类型的变量或者Apple类型的变量都是能够的,因为Apple继承自Fruit,会进行向上类型转换。
method2的办法参数时List<Fruit>,咱们试图传递List<Apple>类型的变量是会呈现编译报错,因为List<Fruit>和List<Apple>并不存在所谓的父子关系,是两种无关的类型,所以编译会报错。
汇合类的继承关系
对于泛化的汇合类型他们的继承关系,以Collection<E>为例,ArrayList<E>实现了List<E>, 同时 List<E> 扩大自 Collections<E>。故 ArrayList<E>是 List<E>的子类型,List<E>是Collections<E> 的子类型。只有类型参数E统一,这三个类的继承关系就失去放弃。如下图所示左右别离是Collection<Fruit>和Collection<Apple>的继承链路。他们两个是互相独立的,没有穿插的两条关系链路,所以尝试在method2中传入appleList会编译报错。
同理,咱们如果定义一个method3的参数列表为Collection<Fruit>,那么依照汇合的继承体系,办法参数中能够传入泛型类型为Fruit的Collection下的所有子类型。
如果有这样的需要List<Fruit>和List<Apple>想应用同样的办法,那么咱们该怎么样定义参数列表呢?
能够应用extends关键字来限度泛型参数的适用范围,List<T extends Fruit> 示意泛型理论参数能够是所有继承自Fruit的类,如lApple等。
小结
泛型类和一般类一样,能够扩大或实现其余的泛型类或接口。ArrayList<E>实现了List<E>接口,一个ArrayList<Apple>能够转化为List<Apple>,而一个ArrayList<Apple>并不是一个List<Fruit>或者ArrayList<Fruit>。
如果咱们要实现List<Fruit>和List<Apple>之间的关联,能够应用泛型通配符在定义方法的时候指明这个List<? extends Fruit>来实现关联。
本篇文章如有帮忙到您,请给「翎野君」点个赞,感谢您的反对。