Java泛型中的协变和逆变

Java泛型中的协变和逆变

一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>List<String>之间是不可变的。但当我们在Java泛型中引入通配符这个概念的时候,Java 其实是支持协变和逆变的。

看下面几行代码:

 
 
 
  1. // 不可变
  2. List<Fruit>fruits =newArrayList<Apple>();// 编译不通过
  3. // 协变
  4. List<?extendsFruit>wildcardFruits =newArrayList<Apple>();
  5. // 协变->方法的返回值,对返回类型是协变的:Fruit->Apple
  6. Fruitfruit =wildcardFruits.get(0);
  7. // 不可变
  8. List<Apple>apples =newArrayList<Fruit>();// 编译不通过
  9. // 逆变
  10. List<?superApple>wildcardApples =newArrayList<Fruit>();
  11. // 逆变->方法的参数,对输入类型是逆变的:Apple->Fruit
  12. wildcardApples.add(newApple());

可见在Java泛型中通过extends关键字可以提供协变的泛型类型转换,通过supper可以提供逆变的泛型类型转换。

--------------------- 本文来自 OkidoGreen 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/z69183787/article/details/51598355?utm_source=copy

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值