先引进两个名词“协变”、“逆变”
协变——用一个窄类型替换宽类型
逆变——用宽类型替换窄类型
协变代码如下:
public class Base { public Number doStuff() { return 0; } } class Sub extends Base { @Override public Integer doStuff() { return 0; } }
逆变代码如下:
public class Base { public void doStuff(Integer i) { } } class Sub extends Base { @Override public void doStuff(Integer i) { } // overload public void doStuff(Number num) { } }
协变即为多态,作者如是说“在java世界里,重复发明轮子的事情多了去了”!哈哈
但是。。。
泛型不支持协变,我很纳闷,为什么呢?
java机制问题,java为了保证运行时安全,必须保证泛型的类型是一致的,即使是父子类都不可以。
不过,泛型提供了一种通配符(Wildcard)模拟协变,代码如下:
List<? extends Number> ln = new ArrayList<Integer>();
? extends Number是什么意思呢?extends是继承的依稀,某某继承Number的意思是说,我只要是Number的一个子类就可以了,by the way,? super Integer是什么意思呢?猜出来了了,只要是Integer的父类皆可,这两者extends super合起来就构成泛型的边界喽!
泛型不支持逆变!同理可以通过通配符模拟,代码如下:
List<? super Integer> ln = new ArrayList<Number>();
相关推荐
JAVA设计模式--程序设计--反射--注解--泛型
本代码资源是一个关于Java语言中泛型的讲解案例代码。通过使用实际的示例代码,详细讲解了泛型的定义、用法和优势。 适用人群: 有一定Java编程基础的开发者;对泛型概念感兴趣或希望加深理解的学习者。 使用场景...
java --泛型编程 课件 同时可结合《java 程序员教程》这本书
包含代码,实验案例,课件(泛型的基本概念、泛型的定义和类型参数、泛型类和泛型接口,泛型委托和泛型事件)
面向对象程序设计201603-编写泛型函数1
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。...泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1491352
一开始我总是分不清协变和逆变,因为MSDN的解释实在是严谨有余而易读不足。 其实从中文的字面上来理解这两个概念就挺容易的了: “协变”即”协调的转变”,”逆变”即”逆向的转变”。 下面来一起看看详细的介绍吧
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490705
C语言在泛型这一块确实不行,哈,但我就是喜欢泛型啊。 用宏定义做的C语言泛型,提供一个思路给大家。
本程序利用c语言来实现c++中STL的功能,也就是利用C语言来实现泛型的数据结构,这个文件中只包含四种数据结构,stack,queue,list,vector
05-java泛型的使用.doc
个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。
试用java.util.Stack泛型栈作为父类,用另一个泛型栈对象作为成员变量,模拟实现一个泛型子类Queue,当存储元素的第1个栈的元素超过dump时,再有元素入队列就倒入第2栈。除提供无参构造函数Queue( )外,其它所有队列...
C#源代码-
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。...泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
超全面javaweb教程第7天-_07_泛型方法和泛型类的使用
一、泛型 为什么要有泛型集合(List,Dictionary,V>,LinkedList)? 1.为了避免装箱拆箱; 2.复用集合类里的 代码(算法) List<string> List 1.概念 1.1官方:是一种特殊的【算法重用】机制。允许程序员在代码中将 ...
Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...