使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。
class A<T>{
//定义了一个泛型类,里面所有的变量,和方法参数,返回值都是T类型
private T a;
public T q(T a){
return a;
}
}
泛型方法
public (static)<Q> Q a(Q a){
return a;//定义在方法返回值前面,可以再泛型类中,也可以在普通类中,使用 类实例.<类型(可以省略)>a(xxx)
Q可以extends。<Q extends A&B&C>Q可以继承一个类和实现多个接口,表示只有继承或实现接口的类才能用这个方法。泛型类也可以extends
}
泛型替换,擦除
虚拟机中没有泛型,只有普通的类和方法。所有的类型参数都用它们的限定类型替换。桥方法被合成来保持多态。为保持类型安全性,必要时插入强制类型转换。
1.不能用基本类型实例化类型参数 class A<double>
2.运行时类型查询只适用于原始类型 A instanceof B<T> 后面的T省略
3.不能抛出也不能捕获泛型类实例,泛型类扩展Throwable都不合法
泛型类不能继承Exception,不能catch(T t){}等等。
4.参数化类型的数组不合法 A<String>[] a =new A<String>[10];
5.不能实例化类型变量
不能使用像new T(...), new T[...]或T.class这样的表达式中的类型变量。
6.泛型类的静态上下文中类型变量无效,不能在静态域或方法中引用类型变量
7.注意擦除后的冲突
泛型类可以扩展或实现其他的泛型类A<T> extends B<T>
通配符
A<? extends B>表示任何继承B的类。使用这个只能get不能set
? extends B get();
void set(? extends B)
A<? super B>表示 任何B的父类。只能set,不能get.
? super B get();
void set(? super B);
带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。
<T extends Comparable<? super T>>表示comparable可以是T类型也可以是T的父类型。
无线定限定符A<?>get得到的是Object,set不能用
? get();
void set(?);