Java泛型(Generic)功能強大易學難理解,易學是因為在一般程式開發時很好用,可是提昇到架構層次思維時,往往以為可以達成的工作卻不work,原因是不了解泛型的本身意涵與限制。

  泛型作用是在於Runtime時才確認要work的Class,是故宣告個pulbic class Generic<T>,在用其它Class去call Generic時,才把T用其它Class取代,例:Generic<String> generic = new Generic<String>;。反過來說,call Generic的時候,還不確定T是什麼類別,或是Generic類別裡的程式又用到泛型,那應該不work的。舉例Spring的RowMapper例子如下,newInstance的參數是Class類別,直接傳泛型T不能compile:

public abstract class AbstractBaseDao<T> {
    // … 略
    protected RowMapper<T> getRowMapper() {
        return ParameterizedBeanPropertyRowMapper.newInstance(T); // Error
    }
}

  後來Google到一種特殊解法,但實在太詭異了,也沒去試,非到不得已才用之,以下是取得T的class的方式:

Class clazz = (Class) ((java.lang.reflect.ParameterizedType) 
    getClass().getGenericSuperclass() 
        ).getActualTypeArguments()[0];

估計0是第一個泛型,若有第二個則以此類推。而好像可以用java.lang.reflect.Type代替Class去接

  此外記錄一下static method使用泛型的用法,和一般method用法有差,也挺詭異的:

public static<T> T getT(Class<T> clazz) throws Exception {
    T obj = ac.getBean(clazz);
    return obj;
}

arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()