欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java泛型总结2-1之核心概念

程序员文章站 2022-04-23 10:44:34
...
什么是泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法

 

泛型的优点

1、类型安全

2、前后兼容

3、泛化代码,代码可以更多的重复利用

4、性能较高,用GJ(泛型JAVA)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件。

 

泛型的缺点

1 由于类型擦除,泛型代码中不能提供类型在运行时的操作,比如new  instanceOf 等 

2 不支持混型,C++通过模板和泛型支持混型,scala通过特质trait支持混型

3 泛型不是在java一开始就有的,是在java5.0加进去的,当把类型代码赋给旧代码时会造成类型信息丢失

 

泛型的工作原理:
  • 1、类型检查:在生成字节码之前提供类型检查
  • 2、类型擦除:所有类型参数都用他们的限定类型替换,包括类、变量和方法(类型擦除)
  • 3、如果类型擦除和多态性发生了冲突时,则在子类中生成桥方法解决
  • 4、如果调用泛型方法的返回类型被擦除,则在调用该方法时插入强制类型转换
泛型方法
边界处的动作(泛型的工作原理的两头部分,1和4)
在传入值的进行额外的编译期的类型检测,在传出值的时候,插入转型代码进行转型    
记住"边界就是发生动作的地方". 就是方法进入时和和方法返回值的时候
 
泛型的协变\ 逆变  
协变:<? extends T>  协变,协变后不能插入数据
逆变:<? super class>  协变的相反过程,可以插入数据,但不能协变
<T> 普通泛型,集合不能协变,插入的数据支持协变
 
桥方法(参考corejava8)
编译过程中,为了解决类型擦除和多态性发生了冲突的问题,于是编译器会在子类中生成一个合成的桥方法,该桥方法是一个父类的重写方法,在方法体中调用冲突的重载方法