java 泛型浅析

就按个人方式谈谈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是不能用在类的定义,一般用在函数参数的定义中,并且是与通配符一起使用的。

以上代码可以运行的,自己试试吧。关于第四点不信,也可以自己试试看。^_^





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值