2015-02-05 37 views
0

我使用Java 6,我有以下代碼...如何從編譯類型獲取類對象?

public abstract class AbstractHibernateDAO<T> 
{ 
    ... 
    protected T find(final Serializable id) 
    { 
     T ret = null; 
     if (id != null) 
     { 
      ret = m_entityManager.find(T, id); 
     } // if 
     return ret; 
    } 

上有一個編譯時錯誤 「RET = m_entityManager.find(T,ID);」因爲該方法的第一個參數應該是一個java.lang.Class對象,但是,我不知道如何創建一個給定「T」編譯時引用或者即使這是可能的。任何幫助表示讚賞。

+3

你不能在一般情況下,由於類型擦除。通常你會有一個構造函數接受'Class '。我敢肯定這是一個騙局,但我還沒有找到相關的重複 - 將繼續尋找。 – 2015-02-05 17:46:09

+0

*「,因爲該方法的第一個參數應該是java.lang.Class對象」* T「不會是java.lang.Class對象。你想'T.class',那也不會編譯。 – 2015-02-05 17:48:00

+0

如果您發現重複,請確認此解決方案適用於Java 6. – 2015-02-05 18:19:22

回答

0

可以從這樣的類簽名拉班型:

public abstract class AbstractHibernateDAO<T> { 
    private Class<T> persistentClass; 

    public AbstractHibernateDAO() { 
     this.persistentClass = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    protected T find(final Serializable id) 
    { 
     T ret = null; 
     if (id != null) 
     { 
      ret = m_entityManager.find(persistentClass, id); 
     } // if 
     return ret; 
    } 
+0

嗨,ParameterizedType類是Java 7構造,不是嗎?我正在使用Java 6. – 2015-02-05 18:11:08

+0

這與Java 6 – jervine10 2015-02-05 18:48:29

+0

一起工作我收到異常,「構造函數拋出異常;嵌套異常是java.lang.ClassCastException:java.lang.Class不能轉換爲java.lang.reflect。 ParameterizedType「在構造函數的行中。 – 2015-02-06 16:59:15