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

什么是泛型

泛型是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)
编译过程中,为了解决类型擦除和多态性发生了冲突的问题,于是编译器会在子类中生成一个合成的桥方法,该桥方法是一个父类的重写方法,在方法体中调用冲突的重载方法

猜你喜欢

转载自zhouchaofei2010.iteye.com/blog/2259880