java list 泛型 继承 强制转换_java 泛型类的继承关系和转型问题

两个问题

问题一:FatherClass和ChildClass是父子类的关系,那List和List是否也是父子类的关系?

问题二:倘若不是父子类关系,那么通过什么方式可以达到向上转型的效果?

有两个类Fruit和Apple,Apple继承自Fruit,所以Fruit使Apple的父类,关系如下图所示

3780fa3ae08fdb4277fbb431aa8c1590.png

示例代码public class GenericMain {

public static void method1(Fruit fruit) {

System.out.println("lingyejun eat fruit");

}

public static void method2(List fruitList) {

System.out.println("lingyejun eat fruit list");

}

public static void method3(Collection 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 fruitList = new ArrayList<>();

fruitList.add(new Fruit());

method2(fruitList);

List appleList = new ArrayList<>();

appleList.add(new Apple());

method2(appleList);// Compile Error

method3(fruitList);// 可以向Collection中传入List

Set fruitSet = new HashSet<>();

method3(fruitSet);// 也可以向Collection中传入Set

method4(fruitList);

method4(appleList);

}

}

method1的方法参数是Fruit类型,想method1方法中传递Fruit类型的变量或者Apple类型的变量都是可以的,因为Apple继承自Fruit,会进行向上类型转换。

method2的方法参数时List,我们试图传递List类型的变量是会出现编译报错,因为List和List并不存在所谓的父子关系,是两种无关的类型,所以编译会报错。

集合类的继承关系

对于泛化的集合类型他们的继承关系,以Collection为例,ArrayList实现了List, 同时 List 扩展自 Collections。故 ArrayList是 List的子类型,List是Collections 的子类型。只要类型参数E一致,这三个类的继承关系就得到保持。如下图所示左右分别是Collection和Collection的继承链路。他们两个是相互独立的,没有交叉的两条关系链路,所以尝试在method2中传入appleList会编译报错。

1ed918c10b68771f7639463d6fbe991e.png

同理,我们如果定义一个method3的参数列表为Collection,那么按照集合的继承体系,方法参数中可以传入泛型类型为Fruit的Collection下的所有子类型。

c58a6bba6fb1e92b8f37f60ea2f38ccd.png

如果有这样的需求List和List想使用同样的方法,那么我们该怎么样定义参数列表呢?

可以使用extends关键字来限制泛型参数的适用范围,List 表示泛型实际参数可以是所有继承自Fruit的类,如lApple等。

小结

泛型类和普通类一样,可以扩展或实现其他的泛型类或接口。ArrayList实现了List接口,一个ArrayList可以转化为List,而一个ArrayList并不是一个List或者ArrayList。

如果我们要实现List和List之间的关联,可以使用泛型通配符在定义方法的时候指明这个List extends Fruit>来实现关联。

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值