Java泛型入门

Java泛型入门,第1张

Java泛型入门 类型擦除

正确理解泛型概念的首要前提是理解类型擦除(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List和List等类型,在编译之后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方式与C++模板机制实现方式之间的重要区别。

类型通配符

? 表示未知类型

K、V 表示键、值(Key、Value)

T 表示任意类型Type

E 表示集合中的元素Element

N 数值类型Number

有界的类型参数

上界定义:偏序集中大于或等于它的子集中一切元素的元素(upper bound)。

下界定义:存在一个实数a和一个实数集合B,使得对∀x∈B,都有x≥a,则称a为B的下界(lower bound)。

这里超类大于子类(超类范围更广)

从上往下排序是:大到小(超类->子类)

extends+上界(子类型限定通配符)

可以解读为:Class是?的上界,? 表示参数化类型是 Class 或是 Class 的子类 。

List说明List中可能包含的元素类型是Number及其子类。

super+下界(超类型限定通配符)

可以解读为:Class是?的下界,? 表示参数化类型是此 Class 类型的超类型 (父类型),直至 Object 。

List则说明List中包含的是Number及其父类。

PECS原则

如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)

如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)

如果既要存又要取,那么就不要使用任何通配符。

泛型类型的继承规则

在使用泛型类时,需要了解一些有关继承和子类型的准则。下面先从许多程序员感觉不太直观的情况开始。考虑一个类和一个子类,如 Employee(父) 和 Manager(子)。Pair是Pair的一个子类吗? 答案是“不是"。

 

最后,泛型类可以扩展或实现其他的泛型类。就这一点而言,与普通的类没有什么区别。例如,ArrayList类实现List接口。这意味着,一个 ArrayList可以被转换为一个List。但是,如前面所见,一个 ArrayList不是一个ArrayList 或List。图12-2展示了它们之间的联系。

 

参考

《Java核心技术 卷1》 第九版 泛型

java-泛型及上界下界详解 - GIGCH - 博客园 (cnblogs.com)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5707952.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)