1.泛型类
泛型类的定义:<T>,可以有多个参数,用“,”分割,如:<T,K>。
/**
* 泛型
* @author Frank
*
* @param <T>
*/
public class Parent<T> {
T data;
public void setData(T data) {
this.data=data;
}
public T getData() {
return data;
}
/**
* 泛型类的实例化
*/
public static void test() {
Parent<String> parent=new Parent<>();
}
}
2.泛型方法
在返回类型前面加上泛型类型的表示符
public class Utils {
/**
* 泛型方法的 示例
* @param d1
* @param d2
* @return
*/
public static <T> boolean compare(T d1,T d2) {
return d1.getClass()==d2.getClass();
}
/**
* 泛型方法的 泛型的范围限定 示例
* @param d1
* @param d2
* @return
*/
public static <T extends Comparable<T>> boolean compare(T d1,T d2) {
return d1.compareTo(d2)==1;
}
}
3.继承泛型类
/**
* 泛型父类
* @author Frank
*
* @param <T>
*/
public class Parent<A,B> {
A a;
B b;
public void setA(A a) {
this.a = a;
}
public void setB(B b) {
this.b = b;
}
}
/**泛型类的继承示例**/
/**
* 全部保留 父类的泛型
* @author Frank
*
* @param <A>
* @param <B>
*/
class P1<A, B> extends Parent<A, B>{
@Override
public void setA(A a) {
// TODO Auto-generated method stub
super.setA(a);
}
@Override
public void setB(B b) {
// TODO Auto-generated method stub
super.setB(b);
}
}
/**
* 部分保留父类的泛型
* @author Frank
*
* @param <A>
*/
class p2<A> extends Parent<A, Integer>{
@Override
public void setA(A a) {
// TODO Auto-generated method stub
super.setA(a);
}
@Override
public void setB(Integer b) {
// TODO Auto-generated method stub
super.setB(b);
}
}
/**
* 全部具体类型并扩展
* @author Frank
*
* @param <C>
*/
class p3<C> extends Parent<Integer, Integer>{
C c;
@Override
public void setA(Integer a) {
// TODO Auto-generated method stub
super.setA(a);
}
@Override
public void setB(Integer b) {
// TODO Auto-generated method stub
super.setB(b);
}
public void setC(C C) {
this.c=c;
}
}
/**
* 类型擦除 父类的泛型变成Object
* @author Frank
*
*/
class p4 extends Parent{
@Override
public void setA(Object a) {
// TODO Auto-generated method stub
super.setA(a);
}
@Override
public void setB(Object b) {
// TODO Auto-generated method stub
super.setB(b);
}
}
4.通配符
<? super T>表示?为T的父类;<? extends T>表示?为T的子类。
<? super T> :可以写,因为?对应为T 的父类;不能读数据,因为不能确定,读取的?是那种类型。
<? extends T> 可以读,因为读取的是T类型;不能写数据,因为不能确定,?所对应的是哪个子类。
注:请记住PECS原则:生产者(Producer)使用extends,消费者(Consumer)使用super。
生产者使用extends:如果你需要一个列表提供T类型的元素(即你想从列表中读取T类型的元素),你需要把这个列表声明成<? extends T>,比如List<? extends Integer>,因此你不能往该列表中添加任何元素。
消费者使用super:如果需要一个列表使用T类型的元素(即你想把T类型的元素加入到列表中),你需要把这个列表声明成<? super T>,比如List<? super Integer>,因此你不能保证从中读取到的元素的类型。
即是生产者,也是消费者:如果一个列表即要生产,又要消费,你不能使用泛型通配符声明列表,比如List<Integer>。