2011-07-25 420 views
1

我有一個類Java泛型問題

public abstract class FakeClass<T extends MyClass> { 
    protected HashMap<Character, T> myMap; 

    private void myMethod(){ 
     myMap.put('c', /*???? I need to instatiate something of type T here.*/) 
    } 
} 

正如你所看到的,我無法弄清楚如何實例類型T的事情是這可能嗎?如果有的話,是否有人能指引我做正確的方向?

謝謝!

+0

請粘貼「MyClass」的代碼,以便我們可以幫助您。 – MacGyver

+0

@Mr。 MacGyver這可能不會幫助,因爲'MyClass'並不總是匹配'T extends MyClass'。什麼是有用的是一些上下文,以什麼地圖將被用於。 – trutheality

+1

@ djs22查看我的答案 –

回答

7

這隻能通過將關於T的一些信息傳遞給myMethod()來完成。在this thread中描述的一種方法是通過工廠對象T。在this thread中描述的一個特例是將Class<T> type參數傳遞給myMethod(),然後可以使用type.newInstance()使用默認構造函數創建一個新的T對象。 (如果T沒有默認構造函數,這將失敗。)Class對象用作T的工廠對象。

我們需要這一切的原因歸功於Java中的type erasure

+0

Java泛型的設計/實現如此令人遺憾。 – luiscubal

+0

類型擦除如何發揮這一點?我會說我們需要這一切的原因是構造函數不會像其他方法那樣繼承。 – trutheality

+0

@trutheality如果沒有類型擦除,JVM(而不僅僅是Java編譯器)會知道T是什麼,所以「new T()」將是有意義的。 – luiscubal

0

通常,泛型的要點是能夠接受編譯時未知類型作爲輸入。

你不能實例化一個未知類(因爲它可能沒有可見的構造函數)。 如果你只需要一個佔位符放入地圖,你可以把一個null值。

不知道更多的上下文,沒有更多的人可以做。