目录
1. 泛型
泛型就是将类型参数化,其在编译的时候才确定具体的参数。
可以在类、接口、方法中创建,分别称为反省类、泛型接口、泛型方法。
在jdk1.5之前(泛型是Jdk1.5 之后才有的),没有泛型的概念,要使用Object来实现通用、不同类型的处理:缺点:(1)每次使用时都要强制转换为想要的类型。(2)在编译时编译器不知道类型的转换是否异常,运行时才知道,不安全。
泛型是一种语法糖,基本原理就是类型擦除(使用泛型时候加上的类型参数,编译器在编译的时候去掉类型参数)。泛型只存在于编译阶段,不存在与运行阶段。
public class A<T> {
private T num;
}
大部分情况下,泛型类型都会以Object 进行替换,但当使用了extends 和 super 语法时,就不能简单用Object来替换了。
public class A <T extends String> {
private T num;
}
这种情况下,num的类型会被替换为String,而不是Object。这是类型限定的一个语法,它限定T是String的子类或者就是 String ,无论T是什么类型,String都是父类,不会出现类型不匹配的问题,于是可以使用String进行类型擦除。
使用泛型的好处:
1. 类型安全
(1)泛型的主要目标就是提高Java程序的类型安全。
(2)编译时期就可以检查出因Java类型不正确导致的类型转换异常。
(3)符合越早出错代价越小原则。
2. 消除强制类型转换
(1)使用时直接得到目标类型,消除许多强制类型转换。
(2)所得即所需,减少出错机会。
3. 潜在的性能收益
(1)所有工作都在编译器完成。
(2)编译器生成的代码与不适用泛型时所写的代码几乎一致。
2. 限定通配符与非限定通配符
限定通配符:
<? extends T> 确保类型必须是T的子类或者就是T,设定了类型的上界。
<? super T > 确保类型必须是T的父类或者就是T,设定了类型的下界。
非限定通配符:
非限定通配符<?> ,可以用任意类型来代替。如 List<?>,他可以是List<A>,List<B>,List<C>等等。