Java泛型中的协变和逆变

Posted zzfx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Java泛型中的协变和逆变的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# (4.0) 不允许泛型类类型中的协变和逆变?

详解C#的协变和逆变

c#泛型的协变和逆变

markdown [Java中的协变和逆变] #java

scala中泛型,协变和逆变

.Net中委托的协变和逆变详解