假设突然看见这个问题。我们常常会想当然。

一个梨子是水果,一筐梨子是一筐水果吗?

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXFqMjA2NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

程序中,我们较少使用到协变性(covariant)。

一个经典的问题:父类Sup有方法m()。有子类Sub

public class CovariantDemo{
public static void main(String[] args) {
Sub[] b = new Sub[10];
Sup[] p = b; p[0] = new Sup();
b[0].m();
}
}

有什么问题?

b是一筐梨子。p是一筐水果,如今你把一个苹果放在了p中。

所以,编译器觉得正确。执行时java.lang.ArrayStoreException: typeSystem.generics.Sup

Java泛型中最令人头痛的是參数化类型的协变性问题。

数组的一个重要性质——协变性(covariant):假设A是B的子类。则A[]是B[]的子类型。

然而对于泛型C<T>,參数化类型C<Object>与C<String>无关。

这违反人们的直观认知

如何说服自己:C<Object>与C<String>无关是合理的。

(1)參数化类型C<梨子>保证当前有一筐梨子。而C<水果>则保证当前有一筐水果,能够向一筐水果中放入苹果、菠萝。假设C<水果>持有C<梨子>引用却不导致编译错误的话,就能够向一筐梨子中放入苹果、菠萝。那么泛型的作用——保证/限定泛型中元素类型的作用将荡然无存。(技术原因:类型參数的擦除)

(2)尽管数组具有协变性,可是在使用时,程序猿要自律地限制元素类型、须要做强制类型转换、或者须要忍受执行时异常而非编译时错误。而这些正是Java泛型要避免的,Java泛型比Java数组使用起来更安全。还有一方面,由于可以方便地使用有限定性的数组如“梨子[]”,数组的协变性不被常常使用。也就不显得讨厌。

(修复例程问题:p[0] =  new Sub(); )

A是B的子类型。參数化类型C<A> 与C<B>无协变性。在某些情况下,却须要參数化类型可以协变,注意,协变指參数化类型之间的协变。为此,Java提供通配符(wildcard)。包含仅仅读通配符“? extends”和仅仅写通配符“?super”。

【5.4.2】

最新文章

  1. 图片放大功能插件及jquery.extend函数理解
  2. jQuery Tocify 定位导航
  3. 免费股票数据API接口
  4. Pointer arithmetic for void pointer in C
  5. VMware共享目录设置
  6. 详解MySQL三项实用开发知识
  7. [C/CPP系列知识] Type difference of character literals 和 bool in C and C++
  8. redis发布/订阅模式
  9. [原]生产环境下的nginx.conf配置文件(多虚拟主机)
  10. VB6-AppendToLog 通过API写入日志
  11. 关于kendo ui的使用改变颜色方式
  12. MVC 控制器详解
  13. java操作elasticsearch实现组合桶聚合
  14. Catfish CMS漏洞集合
  15. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
  16. mysql事务(一)——redo log与undo log
  17. (转)typedef和define的详细区别
  18. lanmp安装一(centos+apache+nginx+mysql+php=lanmp地址下载)
  19. 剑指offer(2) - 二维数组中的查找
  20. flow 类型生成工具 flow-typed 简单使用

热门文章

  1. HDU 2435 There is a war Dinic 最小割
  2. Android针对不同的手机屏幕大小设计图片资源与编码
  3. 解析position定位
  4. 打印机共享为什么老是出现“操作无法完成(错误 0X00000709)。再次检查打印机名称、并确保打印机连接网络
  5. mysql安装遇到的坑
  6. Deepin for Linux 下串口调试交换机
  7. this对象的理解
  8. 00075_BigInteger
  9. Hello World (记事本+命令行)
  10. [BZOJ4184]shallot 线段树+线性基