1. 定义

逆变和协变描述的经过类型变换后的类型之间的关系。假如AB表示类型,f表示类型变换,A ≤B表示A是B的子类型,那么

  • 如果A ≤Bf(A) ≤f(B),那么f是协变
  • 如果A ≤Bf(B) ≤f(A),那么f是逆变
  • 如果两者都不是,那么f不变

    这里的子类型并非是面向对象中继承关系中的子类型,它更多的是描述两个类型之间的兼容性。

2. 实例:泛型

考虑一个例子,假如f(A) = List<A>,且List声明如下:

class List<T> { ... }

那么f是逆变,还是协变,又或者是不变?如果是协变意味着List<String>List<Object>的子类型,如果是逆变意味着List<Object>List<String>的子类型:

ArrayList<String> strings = new ArrayList<Object>();   // error
ArrayList<Object> objects = new ArrayList<String>(); // error

在Java中显然两者都不成立,所以说f是不变,且f表示泛型,即Java泛型是不变。

2. 实例:数组

再举个例子,假如f(A) = A[], 那么f是逆变,还是协变,又或者是不变?如果是协变意味着String[]Object[]的子类型,如果是逆变意味着Object[]String[]的子类型:

Object[] objects = new String[1];

可以看出,在Java中数组是协变。

最新文章

  1. Linux下编译安装PCRE库
  2. java 基本类型
  3. 对象的引用和clone
  4. 设计模式-原型模式(Prototype)
  5. 【jquery插件】收藏
  6. 8-14-Exercise
  7. ecshop--加载初始化文件
  8. leetcode_question_114 Flatten Binary Tree to Linked List
  9. C# 模拟提交带附件(input type=file)的表单
  10. Tomcat修改端口
  11. Java :构造器中的显式参数和this隐式参数
  12. Java 泛型进阶
  13. 计蒜客 踏青 dfs
  14. [PA2014]Matryca
  15. Linux命令:内建命令
  16. powerdesigner 使用
  17. 易出错的bug避免
  18. php非阻塞服务器
  19. VC中使用ADO操作数据库的方法 SQL2000
  20. java使用AES256解密

热门文章

  1. 仿微信、qq聊天,@好友功能
  2. Linux时间日期类,压缩和解压类
  3. Linux平台上常用到的c语言开发程序
  4. 我的第一个netcore2.2 api项目搭建(一)
  5. AI工程师基础知识100题
  6. Samba + DLAN 实现电视机播放电脑文件
  7. 补充1:IDA的脚本IDC语言
  8. 3.kettle-定时执行任务
  9. Prometheus学习笔记(5)Grafana可视化展示
  10. prometheus学习系列十一: Prometheus pushgateway的使用