正确理解泛型概念的首要前提是理解类型擦除(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List
类型通配符? 表示未知类型
K、V 表示键、值(Key、Value)
T 表示任意类型Type
E 表示集合中的元素Element
N 数值类型Number
有界的类型参数上界定义:偏序集中大于或等于它的子集中一切元素的元素(upper bound)。
下界定义:存在一个实数a和一个实数集合B,使得对∀x∈B,都有x≥a,则称a为B的下界(lower bound)。
这里超类大于子类(超类范围更广)
从上往下排序是:大到小(超类->子类)
extends+上界(子类型限定通配符)extends Class> 可以解读为:Class是?的上界,? 表示参数化类型是 Class 或是 Class 的子类 。
List extends Number>说明List中可能包含的元素类型是Number及其子类。
super+下界(超类型限定通配符)super Class> 可以解读为:Class是?的下界,? 表示参数化类型是此 Class 类型的超类型 (父类型),直至 Object 。
List super Number>则说明List中包含的是Number及其父类。
PECS原则
如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)
如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)
如果既要存又要取,那么就不要使用任何通配符。
泛型类型的继承规则在使用泛型类时,需要了解一些有关继承和子类型的准则。下面先从许多程序员感觉不太直观的情况开始。考虑一个类和一个子类,如 Employee(父) 和 Manager(子)。Pair
最后,泛型类可以扩展或实现其他的泛型类。就这一点而言,与普通的类没有什么区别。例如,ArrayList
参考
《Java核心技术 卷1》 第九版 泛型
java-泛型及上界下界详解 - GIGCH - 博客园 (cnblogs.com)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)