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

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

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】

一筐梨子&amp;一筐水果——协变性(covariant)的更多相关文章

  1. m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法

    package com.study; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  2. java面试中的智力题

    智力题,每个正式的笔试.面试都会出,而且在面大企业的时候必然会问到,笔者曾在很多面试中,都被问到过,不过答得都不是很好,因为时间很短,加上我们有时候过于紧张,所以做出这类问题,还是有一定的难度,从这篇 ...

  3. IT智力面试题

    ◆ 有一个长方形蛋糕,切掉了长方形的一块(大小和位置随意),你怎样才能直直的一刀下去,将剩下的蛋糕切成大小相等的两块? 答案:将完整的蛋糕的中心与被切掉的那块蛋糕的中心连成一条线.这个方法也适用于立方 ...

  4. Java之美[从菜鸟到高手演变]之智力题【史上最全】 (转)

    原文地址:http://blog.csdn.net/zhangerqing/article/details/8138296 PS:在一次偶然的机会中,发现了这篇文章.希望大家能开动脑经. 智力题,每个 ...

  5. Java逻辑思维训练题

    两柱香问题题目:有两柱不均匀的香,每柱香燃烧完需要1个小时,问:怎样用两柱香切出一个15分钟的时间段?这个题的重点就是怎么切. 答案:将甲香的一头点着,将乙香的两头点着,当乙香燃烧完时,说明已经过了半 ...

  6. python 练习 1

    from math import sqrt from datetime import date def k1(): #某人是1999年9月29日生日 #问到2006年9月29日他活了多少天 a=dat ...

  7. IT行业智力测试

    1.有10筐苹果,其中有1筐是次品,正品苹果每个10两,次品苹果每个9两,现有一称,问怎么一次称出次品是哪筐? 2.有甲.乙.丙.丁四个人,要在夜里过一座桥.他们通过这座桥分别需要耗时1.2.5.10 ...

  8. [转]100个经典C语言程序(益智类问题)

    目录: 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 8.借书方案知多少 9.杨辉三角形 10.数制转换 11.打鱼还是晒网 12.抓交通肇事 ...

  9. [Thinkbayes]贝叶斯思维读书笔记-1-贝叶斯定理

    使用贝叶斯定理,目前来看最重要的一点在于假设.就是未知事件已知化,同时也要注意假设的全程性,不能从中开始新的假设,这种假设往往是不全面的. 我自己找到的假设的方法有两种,一种是命名,一种是时序.全程性 ...

随机推荐

  1. 关于checkbox的一些jquery操作

    表单在前端开发中是经常会遇到的,其中自然也少不了checkbox复选框,对于复选框的操作无外乎有以下三种:全选,全不选,反选.下面零度逍遥就给大家分析分析. 一.checkbox全选 大家都知道选择c ...

  2. eclipse启动Tomcat加载项目时报内存溢出错误解决办法

    在eclipse中点击Window->Preferences打开全局属性设置对话框,如下图所示设置Tomcat运行时的JVM参数,添加这段JVM设置:-Xms256M -Xmx768M -XX: ...

  3. 洛谷P3355 骑士共存问题

    题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置 ...

  4. 由安装两块网卡的linux系统中引起网络不通想到的

    由安装两块网卡的linux系统中引起网络不通想到的 一天,小王突然急匆匆的来找我,他说:"我在机子上刚装的redhat怎么老也ping不通服务器,我网卡的驱动都安装了,ping 自己的两块网 ...

  5. excel导入数据的

    .aspx 文件 <form id="form1" runat="server"> <div> <asp:FileUpload I ...

  6. 昼猫笔记 JavaScript -- 面向对象(I)

    本文内容搬运自公众号 原文链接 本文主要内容:面向对象 预计阅读时间:6分钟 面向对象的方式 单例模式(字面量定义) var obj = {} 类的实例 var obj = new Object() ...

  7. 【转】一篇关于32位Linux内核使用大内存的文章——Hugemem Kernel Explained  &nb

    红旗DC系列Linux操作系统(x86平台)中带有四类核心: UP (支持单内核) SMP (支持多内核) hugemem Icc* (用intel C编译器编译的核心) 其中hugemem核心往往引 ...

  8. Spring 热点面试题:

    1.谈谈你对Springaop的理解? spring用代理类包裹切面,把他们织入到Spring管理的bean中.也就是说代理类伪装成目标类,它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成 ...

  9. Jsp学习总结(1)——JSP九大内置对象和四种属性范围解读

    一.四种属性范围 1.1.在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效 request:在一次服务请求范围内,服务器跳转后依然有效 session:-在一次会话范围内 ...

  10. android SIM Switch功能和配置

    SIM Switch feature是Smart 3G switch feature在LTE版本号上发展演变而来的功能: MTK双卡双待单通版本号仅仅有一个3/4 G Protocol.所以同一时刻仅 ...