JAVA1.5特性之一,泛型机制的引入。
首先我们先看一个例子,然后再了解泛型的作用。
当我们希望一个类需要持有任何对象的时候,我们会把变量声明成Object,例如:
public class Holder {
private Object obj;
public void setObj(Object obj){
this.obj=obj;
}
public Object getObject(){
return obj;
}
public class TestEntrace {
public static void main(String[] args) {
Holder holder = new Holder();
// 持有一个字符串引用
String str = new String("a");
holder.setObj(str);
// 这个地方获取的对象永远只是一个Object,所以需要强转
String strTemp = (String) holder.getObject();
System.out.println(strTemp);
// 持有基本数据类型
holder.setObj(1);
Integer integer = (Integer) holder.getObject();
System.out.println(integer);
}
}
这样我们的目的就达到了,我们说将一个变量持有Object引用就代表可以有任意类型,但是我们每次获取对象的时候都需要类型强制转换,有时会报ClassCastException,所以JAVA 1.5 引用了泛型( Generic),那么泛型的作用我们可以理解成为了保证类型安全,以下我们通过一到四点来学习泛型的应用。
一.泛型类和泛型接口
下面我重新来修改一下Holder类,<T>就代表参数化类型,当然也可以为A,B,Note:参数类型由外部指定,也就是对象实例化的时候指定。
public class Holder<T> {
private T obj;
public void setT(T obj) {
this.obj = obj;
}
public T getT() {
return obj;
}
}
当然也可以定义多个类型参数,称为元组(tuple)。
public class Holder<A, B> {
private A a;
private B b;
public Holder(A a, B b) {
this.a = a;
this.b = b;
}
}
泛型也适用于继承
public class SubHolder<A,B,C> extends Holder<A, B>{
private C c;
public SubHolder(C c,A a,B b){
super(a,b);
this.c=c;
}
}
在外部指定泛型参数
public class TestEntrance {
public static void main(String[] args) {
Holder<String> holder = new Holder<String>();
// 持有字符串引用类型
holder.setT("string");
// holder.setT(1);// not complie,因为泛型的类型是String,不能添加其它类型
String str = holder.getT();
System.out.println(str);
// 持有基本数据包装类型 Note:泛型是不能用基本数据类型
Holder<Integer> holderI = new Holder<Integer>();
holderI.setT(12);
Integer integer = holderI.getT();
System.out.println(integer);
}
}
定义泛型接口和泛型类一样,例如
public interface Holder<T> {
void add(T t);
}
二.泛型方法
泛型方法的使用:<T>修饰在方法返回值左边。
泛型方法定义的原则:
1.泛型方法是独立的,也就是说当一个类定义泛型方法的时候和这个是不是泛型类没有关系。
2.能使用泛型方法就尽可能这么做,对于一个static方法,无法访问泛型类的类型参数,如果static方法需要使用泛型能力,就必须使用泛型方法。
public class Holder {
public <T> void getName(T t) {
System.out.print(t.getClass().getName());
}
}
三.泛型的擦除作用
四.通配符
五.总结