2011-05-27 28 views
0

如何從具體類中獲取泛型類型?例如,我有:具體類的GenericType

class MyClass<String> 
{ 
public Type getGenericType 
{ 
     // how can I return String.class in here? 
} 
} 

我可以做到這一點抽象類是這樣的:

abstract class MyClass<String> 
{  
    public Type getGenericType 
    { 
    Type t = this.getClass().getGenericSuperclass(); 
    return ((ParameterizedType)t).getActualTypeArguments()[0]; 
    } 
} 

我怎樣才能在具體的類就像抽象類進行類似的操作。如果我不能,你能解釋我爲什麼嗎?

感謝,

+1

你的例子沒有意義。 'String'是否是一個類型參數?爲什麼選擇「字符串」而不是可能導致混淆的東西?按照慣例,類型參數是單個字母,例如'E'或'T'。 – 2011-05-27 04:55:58

+0

你說得對。通常我會讓字符串= T,但是我簡單地說明了這一點,並說明了我的觀點。 – 2011-05-27 12:38:47

回答

2

你不能這樣做,因爲一旦代碼被編譯,泛型甚至不存在了。
您的String恰恰成爲Object

這顯然會導致問題當你的代碼試圖編譯後運行...

0

嘗試是這樣的:

public class MyClass<T> { 

    private final Class<T> type; 

    @SuppressWarnings("unchecked") 
    public MyClass() { 
     type = (Class<T>) this.getClass(); 
    } 

    public Class<T> getGenericType() { 
    return type; 
    } 

} 
+0

構造函數和成員什麼都不做。如果這樣的話,那麼'public class getGenericType(){return this.getClass(); }' – luqui 2011-05-27 05:15:08

+0

糟糕,錯別字。我已經更新了我的答案。 – JVerstry 2011-05-27 05:23:07

0

在這個階段,Java不支持泛型的reification。但是,可以在運行時爲字段和方法獲取參數類型信息。 This article對此事有很好的洞察力。對於類常常是方便的參數類型傳遞到構造明確:

class ClassWithParameter<T> { 
private final Class<T> parameterType; 

public ClassWithParameter(final Class<T> parameterType) { 
     this.parameterType = parameterType; 
} 
... } 

或者,類屬性的定製運行時註解可以被創建並用於註釋類,它們需要在運行時參數類型信息。