extends
List<? extends Number>
下面这三种通配符声明都是合法的
List<? extends Number> foo3 = new ArrayList<Number>(); // Number "extends" Number (in this context) List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
Reading
- 能从foo3中读一个Number
- 不能从foo3中读一个Integer
- 不能从foo3中读一个Double
Writing
- 不能添加Number到foo3
- 不能添加Integer到foo3
- 不能添加Double到foo3
因为foo3可以指向任意Number的子类型list,只能保证从foo3中读出的是Number,不能确定foo3指向的是一个什么类型,所以add任意类型都会报错
super
List <? super T >
下面这三种通配符声明都是合法的
List<? super Integer> foo3 = new ArrayList<Integer>(); // Integer is a "superclass" of Integer (in this context) List<? super Integer> foo3 = new ArrayList<Number>(); // Number is a superclass of Integer List<? super Integer> foo3 = new ArrayList<Object>(); // Object is a superclass of Integer
Reading
- 不能确定读出的是一个Integer,因为有可能指向List<Number> or List<Object>
- 不能确定读出的是一个Number,因为有可能指向List<Object>
- 只能读出Object,但无法确定这个Object是什么类型
Writing
- 能add Integer,
- 能add Integer的子类型
- 不能add Double
- 不能add Number
- 不能add Object
总结
- 如果你想从一个数据类型里获取数据(List#get()),使用 ? extends 通配符
- 如果你想把对象写入一个数据结构里(LIst#add()),使用 ? super 通配符
- 如果你既想存,又想取,那就别用通配符。
举个栗子
public static <T> void copy(List<? extends T> src, List<? super T> dest) { for (int i = 0; i < src.size(); i++) { dest.add(i, src.get(i)); } }
英文wiki
http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java
相关推荐
Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南
Java Generics and Collections 英文版,详细描述java 泛型技术
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
java 泛型接口示例 java 泛型接口示例 java 泛型接口示例
java 泛型方法使用示例 java 泛型方法使用示例 java 泛型方法使用示例
java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例
[简单粗暴]一文彻底搞懂Java泛型中的PECS原则(在坑里躺了多年终于爬出来了)
1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....
4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...
java泛型技术之发展,学习JAVA 泛型的不错东东
主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
深入理解java泛型,包括类名泛型的定义,方法泛型定义,泛型的返回
java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx
很好的Java泛型的总结,看完之后你一定会知道java泛型的底层机制,你一定会学会Java泛型!
java泛型详解.pdf
思维导图之Java泛型详解
Java泛型使用详细分析.pdf
实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门
JAVA泛型源代码实现以下功能:返回数组元素的最大值/最小值下标;判断数组元素是否按升序排列;T对象数组排序;二分法查找key元素;