Java5新特性-泛型的使用总结(二)


泛型通配符和边界
ValueHolder<?>表示能匹配任何实际的类型,其中<?>称之为通配符类型(wildcard type)。在使用通配符类型的变量上,我们不能调用任何含有通配符类型参数的方法(除非这些参数设置为null值,因为null可以是任何类型的成员)。
在一些场合中,我们希望能够限制<?>能匹配的类型范围,从而能够做一些更有意义的事情,我们可以给<?>加上一个边界。
<? extends InterfaceOrClass>表示只能匹配那些继承指定接口或者类的子类(或者子接口),这时我们称InterfaceOrClass为类型通配符的上界(upper bound of the wildcard)。
<?>也可以理解为<? extends Object>,这时Object就是上界,实际上也就是所有类型,因为所有类型的根都是Object。
<? super InterfaceOrClass>表示只能匹配指定接口或者类的超类(或者实现的接口),这时我们称InterfaceOrClass为类型通配符的下界(lower bound of the wildcard)。

泛型的定义:
  1.类定义
  2.方法定义

泛型通配符:
  1.?
  2.上限
  3.下限

T.class的取得方式及其限制:

不知为何书上不怎么讲这个,是差沙告诉我才知道的,最经典的应用见Hibernate wiki的 Generic Data Access Objects, 代码如下: 
abstract  public  class  BaseHibernateEntityDao < T >  extends  HibernateDaoSupport {
 
private  Class<T> entityClass;
 
public  BaseHibernateEntityDao() {
        entityClass 
= (Class<T>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];
    }
 
public  T get(Serializable id) {
        T o 
=  (T) getHibernateTemplate().get(entityClass, id);
}
}

  精华就是这句了:
Class < T >  entityClass  =  (Class < T > ) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ]; 

  泛型之后,所有BaseHibernateEntityDao的子类只要定义了泛型,就无需再重载getEnttityClass(),get()函数和 find()函数,销益挺明显的,所以 SpringSide的Dao基类毫不犹豫就泛型了。

  不过擦拭法的大棒仍在,所以子类的泛型语法可不能乱写,最正确的用法只有:
   
public  class  BookDao  extends  BaseHibernateEntityDao < Book >


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值