就按个人方式谈谈java泛型的一些理解吧!泛型应源于C++中模板类的概念!以下谈几点应用的经验总结:
1. 在编译源码时,泛型的具体类型就可以确定了。因此可以避免运行时的类型转换错误,也可以说提前暴露错误。
2. 通配符 (?)是不能用在类定义中的,可以用在函数定义中。与关键字 extends 、super 连在一起使用。
3. 关键字extends 、super 个人理解为限定词,就如英文中的定语,进一步确定类的范围。extends 限定了类上限,也就是说此泛型超类是什么类,比如没有限定可以是Object 的所有子类都是可以的,指定 A 以后就只能是A 的所有子类。super 限定了泛型的下界,也就是指定A限定了泛型是类A的超类,这个很有用,主要是用在泛型类动态化调用中。
4. 定义变量是最好不要用关键字 extends 、super ,用了会使泛型变得复杂。
下面举一个简单的例子:
public class SuperBean {
private String sname = null;
}
public class SubBean extends SuperBean {
}
以下为泛型类:
public class TestSuper<T> {
public String getType(Class<T> ct){
return ct.getName();
}
public String getTypeSuper(Class<? super T> ct){
return ct.getName();
}
public String getTypeExtend(Class<? extends T> ct){
return ct.getName();
}
}
public class TestTmp<T extends SuperBean> extends TestSuper<T> implements TestInterf{
public static void main(String[] args){
TestTmp<SubBean> t = new TestTmp<SubBean>();
System.out.println(t.getType(SubBean.class));
System.out.println(t.getTypeSuper(SuperBean.class));
System.out.println(t.getTypeSuper(SubBean.class));
System.out.println(t.getTypeExtend(SubBean.class));
}
}
来看看最后这个类吧:
TestTmp<SubBean> t 申明了类变量,指定泛型类SubBean,泛型中T其实就是个占位符而已,因此此时所有泛型T都被 SubBean取代了。
看看 TestSuper 中各个函数的情况吧:getType(Class<T> ct) 就是 getType(Class<SubBean> ct) 所以只能出入参数为 SubBean.class 而不能以父类为参数;
getTypeSuper(Class<? super T> ct) 就是 getTypeSuper(Class<? super SubBean> ct) 从第三条可知是说SubBean的超类是可以的,因此 以SuperBean.class为参数,也是可以的;
再来看看 getTypeExtend(Class<? extends T> ct) 就是 getTypeExtend(Class<? extends SubBean> ct) 从第三条可知是说SubBean的所以子类是可以的,所以只能出入参数为 SubBean.class 而不能以父类为参数。
总的来说泛型是为避免过多运行时的类型检查而设计的,但是对面向对象的动态调用造成了一些麻烦。因此 ? super SubBean 这种方式是及其重要的;一般来说 extends 用在类定义中,而 super是不能用在类的定义,一般用在函数参数的定义中,并且是与通配符一起使用的。
以上代码可以运行的,自己试试吧。关于第四点不信,也可以自己试试看。^_^