2013-09-25 73 views
0

我有這個問題新<T>在Java中

的方法,它是由一類切割不需要的細節,並與那些通緝返回對象的集合。問題是我希望這個metod能夠與不同的類一起工作(雖然它是基於一個抽象的),所以我使用泛型類型。問題是有一點我需要創建一個實例,這是不可能的。我尋找了一些出路,但似乎不適合我的情況。 所以,代碼如下

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates) { 
    List<T> restMandates = new ArrayList<>(mandates == null ? 0 
      : mandates.size()); 
    if (mandates != null) { 
     for (CardMandate mandate : mandates) { 
      restMandates.add(new T(mandate)); 
     } 
    } 

    return restMandates; 
} 

RestMandate是基類,CardMandate是我取的信息。有任何想法嗎?

+0

你想簡單地從列表''到'名單'轉換? –

+0

實際上是的)問題是,CardMandate的對象有太多爭論,我正在*取出它們。如果你有其他更簡單的解決方案,我將不勝感激) – spl1n

+0

你是什麼意思*對象有太多的論據?* –

回答

3

由於泛型類型參數在運行時被擦除,有沒有辦法可以參考它就像你正在嘗試做的。唯一的出路是一個類型標籤參數+反射實例化。

更好的選擇是重新設計您的解決方案來解決這個問題,而不依賴於泛型和類型標籤。改爲使用動態方法調度:向RestMandate添加一個方法,該方法將返回轉換爲所需類型的對象。

+0

我明白,但我喜歡這種方法)它是如此的好,除了這件事與實例化。我會在工廠模式中執行以防萬一沒有解決方案可以幫助 – spl1n

+0

它會在其他語言中有很好的效果 –

1

要創建一個實例你需要Class<T>對象太

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates, Class<T> clazz) { 
    //.... 
    T newInst = clazz.newInstance(); 

    //.... 
} 
+0

我見過這個,newInstance有例外的麻煩,程序不想支持variant Constructor.newInstance() – spl1n

+0

他正在使用參數化的構造函數。 'newInstance()'需要一個0-arg構造函數。 –

+0

是的,http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance() – spl1n

3

由於Type Erasure,T在運行時變爲對象。你不知道它的真實類型了。

如果你有它的類,你仍然可以通過反射來實例化對象。爲了做到這一點,你必須給類的方法:

private <T extends RestMandate> List<T> toRestMandate(List<CardMandate> mandates, Class<T> clazz) { 
    ... 
    for (CardMandate mandate : mandates) { 
    /* 
     * I get the constructor which needs one CardMandate and call it. 
     * Note : I do not recommend this solution (no check at compile-time!). 
     * Like Marko Topolnik, I advise to redesign the solution. 
     */ 
    restMandates.add(clazz.getConstructor(CardMandate.class).newInstance(mandate)); 
    } 
    ... 
} 
+0

他正在使用參數化構造函數。 'newInstance()'需要一個0-arg構造函數。 –

+0

編輯,謝謝。 –

+0

我不能稱這一個。它一直說類型不匹配。 列表 cardMandates; List restMandate; toRestMandate(cardmandates,restMandate); – spl1n