的接口實現我想要做一個類,基本上是這樣的:獲取類的Java的泛型,和泛型
public class MyClass<T implements Serializable) {
void function() {
Class c = T.class;
}
}
兩個錯誤:
- 我不能叫T.class,即使我可以使用任何其他對象類型
- 我不能強制T以這種方式實現Serializable
如何解決我的兩個泛型問題?
乾杯
聶
的接口實現我想要做一個類,基本上是這樣的:獲取類的Java的泛型,和泛型
public class MyClass<T implements Serializable) {
void function() {
Class c = T.class;
}
}
兩個錯誤:
- 我不能叫T.class,即使我可以使用任何其他對象類型
- 我不能強制T以這種方式實現Serializable
如何解決我的兩個泛型問題?
乾杯
聶
您無法獲取該類型。
泛型使用名爲type-erasure的東西來實現。
當一般類型被實例化, 編譯器通過 翻譯這些類型的技術稱爲類型擦除 - 一個 方法,其中,編譯器將刪除輸入參數 和一類或 內鍵入參數相關的所有 信息方法。類型擦除使Java 使用泛型的應用程序能夠與 保持二進制兼容性 Java庫和應用程序 在泛型之前創建。
其實質是編譯器使用的類型信息被丟棄,因此在運行時不可用。
至於強制執行措施的T implements Serializable
,你只需要:
public class MyClass<T extends Serializable>)
{
public void function(T obj)
{
...
}
}
這簡直是指是關係,所以實現Serializable
一類,是一個Serializable
和能傳遞給function
。
感謝您的出色解釋,我現在明白了爲什麼它不起作用,並且我解決了gjrwebber提出的解決方法的實際問題。謝謝一堆! :-) – niklassaers 2009-08-24 08:14:23
東西沿着這些線路應該這樣做。
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;
}
感謝您的解決方法,這幫助我解決了問題,其他答案幫助我理解了這個問題。 :-) 你們是最棒的! :-) – niklassaers 2009-08-24 08:13:26
我得到了一個sun.reflect.generics.reflectiveObjects.TypeVariableImpl無法轉換爲java.lang.Class,我錯過了什麼? – 2011-04-03 02:55:20
你不能做T.class,因爲java實際上並不知道在運行時T是哪個類。
所有這些信息在編譯時都會丟失。
要獲取類對象對於T你可以在T的實例調用的getClass()(如果你有機會到一個),或要求用戶通過類對象作爲參數傳遞給function
,如:
void function(Class<T> c)
通用參數邊界的語法是
啊對了。我刪除了我的答案的一部分。 – sepp2k 2009-08-24 07:49:53
感謝您的快速反饋。 (1)問題在於,在我的泛型函數中,我想使用將T.class作爲輸入參數的函數。如果我不能這樣做,一個不太好的解決方法是實例化一個類T的對象,但據我瞭解,我不能說「新的T()」,再次因爲類型擦除? (2)Doh,沒有看到錯字。但是,我的Java編譯器聲稱它在我編寫器件時期望逗號,這就是我的意思。編輯:謝謝tkopec,擴展工作得更好,我不知道我可以擴展接口 – niklassaers 2009-08-24 08:05:15
這是不可能沒有技巧。 Java Generics FAQ提供了一種解決方法的想法。
你這樣做:
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
}
}
這是一種令人討厭的,但並不真正那麼大的一個麻煩整體。
非常感謝,這是一個優雅的解決方法:-) – niklassaers 2009-08-24 08:15:27
這是一個非常簡單和很好的解決方案 – satya 2014-01-03 13:30:54
您可以添加一個您實際想要實現的示例嗎? – Zed 2009-08-24 07:43:15