2016-04-03 84 views
1

我有一個泛型方法,我怎麼才能得到T類?如何在泛型方法中獲得泛型類的類實例

class MyClass 
{ 
    static <T> void foo(T t) 
    { 
     // how to get T.class 
    } 
} 

t.getClass()得到最多的派生類,但T可能是一個超類,所以它在MyClass的情況下不起作用。 <Collection> foo(new ArrayList())。

+4

這是不可能的。閱讀關於類型擦除。您可以做的最好的方法是添加另一個參數'Class clazz'。 –

+0

在這種情況下'T'是編譯時的'Object',所以'Object.class'完成了這個任務。否則,'t.getClass()'怎麼樣?附:不要讓任何人告訴你這與刪除有關,它不會;你還沒有爲'T'定義任何界限。 –

+0

'''T'''是_weak_類型,但是'''getClass()''返回_strong_類型的類。看到[這個問題](http://stackoverflow.com/questions/106336/how-do-i-find-out-what-type-each-object-is-in-a-arraylistobject) –

回答

2

如果你想保留你的簽名是不可能的。但是,有一種方法可以通過將類型作爲單獨的參數來解決此問題。

static <T> void foo(T t, Class<T> cls) { 
    // use cls 
} 

而不是調用

MyClass.<Collection> foo(new ArrayList()); 

然後調用

MyClass.foo(new ArrayList(), Collection.class); 
+0

我來自C++,我們使用泛型來推斷類型。可悲的是,這在Java中是不可能的。 –