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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章