2009-08-24 103 views
5

的接口實現我想要做一個類,基本上是這樣的:獲取類的Java的泛型,和泛型

public class MyClass<T implements Serializable) { 

    void function() { 
     Class c = T.class; 
    } 
} 

兩個錯誤:
- 我不能叫T.class,即使我可以使用任何其他對象類型
- 我不能強制T以這種方式實現Serializable

如何解決我的兩個泛型問題?

乾杯

+0

您可以添加一個您實際想要實現的示例嗎? – Zed 2009-08-24 07:43:15

回答

7

您無法獲取該類型。

泛型使用名爲type-erasure的東西來實現。

當一般類型被實例化, 編譯器通過 翻譯這些類型的技術稱爲類型擦除 - 一個 方法,其中,編譯器將刪除輸入參數 和一類或 內鍵入參數相關的所有 信息方法。類型擦除使Java 使用泛型的應用程序能夠與 保持二進制兼容性 Java庫和應用程序 在泛型之前創建。

其實質是編譯器使用的類型信息被丟棄,因此在運行時不可用。

至於強制執行措施的T implements Serializable,你只需要:

public class MyClass<T extends Serializable>) 
{ 
    public void function(T obj) 
    { 
    ... 
    } 
} 

這簡直是指關係,所以實現Serializable一類,是一個Serializable和能傳遞給function

+1

感謝您的出色解釋,我現在明白了爲什麼它不起作用,並且我解決了gjrwebber提出的解決方法的實際問題。謝謝一堆! :-) – niklassaers 2009-08-24 08:14:23

3

東西沿着這些線路應該這樣做。

private Class<T> dataType; 
Type type = getClass().getGenericSuperclass(); 
if (type instanceof ParameterizedType) { 
    ParameterizedType paramType = (ParameterizedType) type; 
    dataType = (Class<T>) paramType.getActualTypeArguments()[0]; 
} else if (type instanceof Class) { 
    dataType = (Class<T>) type; 
} 
+0

感謝您的解決方法,這幫助我解決了問題,其他答案幫助我理解了這個問題。 :-) 你們是最棒的! :-) – niklassaers 2009-08-24 08:13:26

+5

我得到了一個sun.reflect.generics.reflectiveObjects.TypeVariableImpl無法轉換爲java.lang.Class,我錯過了什麼? – 2011-04-03 02:55:20

1

你不能做T.class,因爲java實際上並不知道在運行時T是哪個類。

所有這些信息在編譯時都會丟失。

要獲取類對象對於T你可以在T的實例調用的getClass()(如果你有機會到一個),或要求用戶通過類對象作爲參數傳遞給function,如:

void function(Class<T> c) 
+0

通用參數邊界的語法是而不是 2009-08-24 07:46:00

+0

啊對了。我刪除了我的答案的一部分。 – sepp2k 2009-08-24 07:49:53

+0

感謝您的快速反饋。 (1)問題在於,在我的泛型函數中,我想使用將T.class作爲輸入參數的函數。如果我不能這樣做,一個不太好的解決方法是實例化一個類T的對象,但據我瞭解,我不能說「新的T()」,再次因爲類型擦除? (2)Doh,沒有看到錯字。但是,我的Java編譯器聲稱它在我編寫器件時期望逗號,這就是我的意思。編輯:謝謝tkopec,擴展工作得更好,我不知道我可以擴展接口 – niklassaers 2009-08-24 08:05:15

5

你這樣做:

public class MyClass<T implements Serializable) { 

    void function(Class<T> tc) { 
     ... 
    } 
} 

基本上,你必須在運行時類傳遞才能看到它。你也可以做這樣的事情:

public class MyClass<T implements Serializable) { 
    Class<T> ct; 
    public MyClass(Class<T> ct){this.ct = ct;} 

    void function() { 
     ... //you know what the class is here 
    } 
} 

這是一種令人討厭的,但並不真正那麼大的一個麻煩整體。

+1

非常感謝,這是一個優雅的解決方法:-) – niklassaers 2009-08-24 08:15:27

+0

這是一個非常簡單和很好的解決方案 – satya 2014-01-03 13:30:54