2010-12-19 186 views
0

對不起,我不知道如何恢復我的問題。是否可以在通用性中引入通用性?

讓我介紹一下我的問題:

我希望得到一個泛型類型的類型。

一些代碼:

public class AbstractDao<T, PK extends Serializable> { 
    public T getByPrimaryKey(PK primariKey) { 
    return null; 
    } 
} 

public class AbstractEntity<PK extends Serializable> { 
    PK id; 
    //Getter Setter 
} 

public class Entity extends AbstractEntity<Long> { 
} 

我想的代碼更改:

public class AbstractService<T, PK extends Serializable> { 
    AbstractDao<T, PK> dao; 

    public T getByPrimaryKey(final PK primaryKey) { 
     return dao.getByPrimaryKey(primaryKey); 
    } 
} 

public class EntityService extends AbstractService<Entity, Long> {} 

的想法是去掉 「PK擴展序列化」,從AbstractService 並得到它動態地。

任何想法如何做到這一點? - > PK應該留...我不想使用的方法「對象」,而不是「PK」:

public T getByPrimaryKey(final PK primaryKey) 

感謝您的幫助。

親切的問候

+0

「這個想法是從AbstractService中刪除」PK extends Serializable「並動態獲取它。」你是什​​麼意思,「動態獲取」?你想用它做什麼? – 2010-12-19 15:42:16

+0

要從哪裏動態獲取它?你不喜歡你現在的代碼是什麼? – 2010-12-19 15:46:08

回答

0

如果你不想一個通用PK類型,那麼你可以創建一個PrimaryKey接口,爲不同的實施方式的實際主鍵的包裝,如LongPrimaryKey等。這樣,你才能避免泛型類型。但是,如果您希望能夠傳遞實際的類型(例如Long),那麼我不會看到一種繞過泛型的方式,在我看來,這種方式已經很好地放置在了它的位置。

0

如果您創建AbstractDao的具體實例,那麼java可以確定它的泛型類型。

(Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

會給你第一個通用放慢參數的運行時類型。這並不總是可用的,所以請檢查文檔和。

相關問題