学习Java的同学注意了!!! 
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java!

协变和逆变指的是宽类型和窄类型在某种情况下的替换或交换的特性。简单的说,协变就是用一个窄类型替代宽类型,而逆变则用宽类型覆盖窄类型。

1 协变

在Java中协变的例子非常常见,例如,面向对象的多态,以及数组的协变特性,下面看一下协变的例子:

1
2
3
4
5
6
7
8

public class Test
{
     public static void main ( String [ ] args )
     {
         Number num1 = new Integer ( 0 ) ;
         Number [ ] num2 = new Integer [ 10 ] ;
     }
}

而在泛型是不支持协变的,看下面的代码:

1
2
3
4
5
6
7
8

public class Test
{
     public static void main ( String [ ] args )
     {
         List < Object > list = new ArrayList < String > ( ) ; //编译错误
         list = new ArrayList < Object > ( ) ;
     }
}

虽然泛型不支持协变的,但是可以通过通配符进行模拟:

1
2
3
4
5
6
7

public class Test
{
     public static void main ( String [ ] args )
     {
         List < ? extends Object > list = new ArrayList < String > ( ) ;
     }
}

注意:? extends Object的含义是:运行Object的子类,也包括Object,作为泛型参数。

2 逆变

在Java中不允许将父类变量赋值给子类变量。泛型自然也不支持逆变。但是在泛型中可以通过通配符进行模拟,如下例子:

1
2
3
4
5
6
7

public class Test
{
     public static void main ( String [ ] args )
     {
         List < ? super Integer > list = new ArrayList < Number > ( ) ;
     }
}

学习Java的同学注意了!!! 
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java!

转载于:https://my.oschina.net/abcijkxyz/blog/850903

Java中的逆变与协变相关推荐

  1. java中的逆变、协变、不变概念讲解转载自http://www.cnblogs.com/en-heng/p/5041124.html,感谢编程路上的前辈们!

    En-Heng 无他,但手熟尔 博客园 首页 新随笔 联系 订阅 管理 随笔 - 32  文章 - 0  评论 - 33 Java中的逆变与协变 看下面一段代码 Number num = new In ...

  2. 协变逆变java_Java中的逆变与协变

    什么是逆变与协变 协变(Covariance) 如果B是A的子类,并且F(B)也是F(A)的子类,那么F即为协变 逆变(Contravariance) 如果B是A的子类,并且F(B)成了F(A)的父类 ...

  3. 跟着小老弟来学习Kotlin中的逆变和协变

    /   今日科技快讯   / 近日,小米创始人.董事长兼CEO雷军在抖音上开启了其直播带货的首秀.从晚上8点开播,到晚上10点,销售额就已经破亿.包括1000台售价49999元的透明电视在内的商品一推 ...

  4. java泛型的逆变_Java泛型的协变与逆变

    泛型擦除 Java的泛型本质上不是真正的泛型,而是利用了类型擦除(type erasure),比如下面的代码就会出现错误: 报的错误是:both methods  have same erasure ...

  5. java泛型的逆变_Java泛型的逆变

    在上篇<Java泛型的协变>这篇文章中遗留以下问题--协变不能解决将子类型添加到父类型的泛型列表中.本篇将用逆变来解决这个问题. 实验准备 我们首先增加以下方法,见代码清单1所示. 代码清 ...

  6. C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

    一.为什么使用泛型? 泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型将占位符替换 ...

  7. 第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)

    一. 泛型诞生的背景 在介绍背景之前,先来看一个案例,要求:分别输出实体model1.model2.model3的id和name值,这三个实体有相同的属性名字id和name. 1 public cla ...

  8. 泛型委托的逆变和协变

    泛型委托:委托实际只是提供了4个方法的一个类定义.这4个方法包括:一个构造器.一个Invoke方法.一个BeginInvoke方法和一个EndInvoke方法.如果定义的一个委托类型指定了类型参数,编 ...

  9. 【转】逆变与协变详解

    逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画图详细解 ...

最新文章

  1. Linux 命令行敲命令 光标移动快捷键
  2. 词云图可视化python_python 可视化 词云图
  3. Spring+Hibernate的典型配置
  4. Django配置数据库读写分离
  5. centos-修改yum下载源为国内阿里源-
  6. od send断点 下_Win7 od下send断点
  7. html调用阅读模式,easyread.js—给网站开启阅读模式html教程
  8. Java_常遇问题(一)
  9. CentOS7安装minio
  10. OpenCV实现车牌识别,OCR分割,ANN神经网络
  11. android投影仪分辨率是多少,如何挑选投影仪流明 分辨率?千万不要这样选,不然后果不堪设想...
  12. 共享单车设计经验总结
  13. 继电保护原理6-发电机保护
  14. Windows 技术篇-cmd命令查看系统启动时间、操作系统信息、内存使用情况、电脑配置信息
  15. Fabric开发(三) Ubuntu20.04.1快速搭建Fabric1.4.3 (排雷版)
  16. js ios和安卓的兼容时间处理
  17. java数组逆序_Java 数组的排序、逆序
  18. 【网易有数】BI数据分析工具一
  19. springboot下载excel(解决文件损坏问题)
  20. Groovy 字符串

热门文章

  1. centos 7 安装 Python 3.9
  2. 计蒜课/百度的年会游戏(枚举)
  3. Derby网络服务器配置
  4. 互联网体系结构的理解
  5. 【论文翻译】MobileNets: Efficient Convolutional Neural Networks for Mobile VisionApplications【v1, 2017.4】
  6. 汇编cmp比较指令详解
  7. 凯斯西储大学轴承数据具体处理过程(用作CNN输入)
  8. 在Linux-C中使用read函数返回值为0的问题
  9. php ip 城市,php如何根据IP地址获取所在城市
  10. 手机外接usb摄像头软件下载_手机清理助手软件下载-手机清理助手appios版下载...