[英]Get “real” class of generic type
如何獲得泛型類型的“真實”類?
例如:
public class MyClass<T> {
public void method(){
//something
System.out.println(T.class) //causes a compile error, I wont the class name
//something
}
}
如果T =整數
輸出:
java.lang.Integer
如果T = String
輸出:
java.lang.String
謝謝
如果您的類中有一個類型為T的實例變量,並且恰好已設置,則可以打印該變量的類。
public class Test<T> {
T var;
public static void main(String[] args) {
Test<Integer> a = new Test<Integer>();
System.out.println(a.boo());
a.setVar(new Integer(10));
System.out.println(a.boo());
}
public String boo() {
if (var == null) {
return "Don't know yet";
}
return var.getClass().getSimpleName();
}
public void setVar(T var) {
this.var = var;
}
public T getVar() {
return var;
}
}
你不能。 在編譯時從代碼中剝離信息,這個過程稱為類型擦除。 有關更多信息,請查看此處: 類型擦除
編輯:對不起我的錯,信息沒有在運行時加載。
正如其他人所解釋的那樣,你不能以這種方式去做,但這就是它通常在java中實現的方式。
public class MyClass<T> {
public void method(Class<T> clazz) {
// something
System.out.println(clazz.getName());
// something
}
}
你像這樣使用它
new MyClass<String>().method(String.class);
在你的情況下,你不能。 但是,您可能可以使用超類型標記來執行此類操作: http : //gafter.blogspot.com/2006/12/super-type-tokens.html
這些的示例實現是Jackson json處理庫的TypeReference類。
這是高級的東西,可能比你想知道的更多;-)
請注意,在使用泛型類型接收的實例上依賴於'getClass()'的方法將獲得該對象的實際類型,這不一定是泛型類型 - 這將是調用者知道該實例的類型。
例如,考慮調用者通過接口處理對象的情況; 傳遞給泛型構造時,泛型類型將是接口,而不是實例的實際類。
考慮以下示例“Pair”類,它允許通過POJO返回兩個對象引用:
public class Pair<U,V>
{
public final U first;
public final V second;
public static <U,V> Pair<U,V> of (U first, V second)
{
return new Pair<U,V> (first, second);
}
protected Pair (U first, V second)
{
this.first = first;
this.second = second;
}
}
我們正在考慮如何修改'Pair.of()'工廠函數以返回Comparable Pair派生類,如果U和V都是Comparable。 然而,雖然我們可以使用instanceof來判斷“第一”和“第二”是否具有可比性,但我們不知道“U”和“V”本身是可比較的。
為此,Pair.of()返回的Pair的確切類型必須依賴於泛型類型, 而不是實際的參數類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.