[英]Get the the type of the class of a generic type?
一個 class 有一個聲明如下的方法:
public class A{
public <T> T test(java.lang.Class<T> classOfT)
}
通常可以像這樣針對 object 調用它:
A a = new A()
String s = "test";
a.test(String.class); //I wrote this as s.class at first,which is wrong.Thanks Nick.
現在我想概括傳遞給它的 object,所以我聲明一個 class 如下:
public class B <T>{
private A a = new A();
private T obj = null;
T test(){return a.test(obj.getClass()); }
}
但是代碼不會'編譯。我想知道是否有可能實現我的目標?
提前感謝您 Java 大師;)
T obj = ...;
obj.getClass()
最后一行返回Class<? extends T>
Class<? extends T>
-- 但是T
是無界的,所以它基本上以Object
為界,這意味着它返回Class<? extends Object>
Class<? extends Object>
,與Class<?>
相同。
所以這樣做:
T test () { return a.test(obj.getClass()); }
實際上會使用Class<?>
類型的參數調用a.test
,它返回Object
,而不是T
。
只需將參數轉換為Class<T>
或將返回類型轉換為T
,它應該可以工作——盡管我還不明白你為什么需要這樣的東西。 此外,原始帖子中存在這個奇怪的錯誤:
String s = "test";
a.test(s.class);
做"test".class
是錯誤的——它應該是String.class
。
Class<T> clazz = (Class<T>) obj.getClass();
return a.test(clazz);
嘗試
@SuppressWarnings("unchecked")
T test() {
return (T) a.test(obj.getClass());
}
作為其他答案的補充,將您的 function 定義為
public class A{
public <T> T test(java.lang.Class<T> classOfT) { ... }
}
如果您使用classOfT
參數只是為了確定T
的類型,那么您最好在完全沒有參數的情況下定義您的方法。 例如,這樣做而不是上面的聲明:
public class A{
public <T> T test() { ... }
}
這樣你就可以使用這種合格的方法調用語法來調用它。 這就是我將如何重寫您的代碼:
public class A{
public <T> T test() {
// ...
}
public static void main(String[] args) {
A a = new A();
String result = a.<String>test();
}
}
public class B <T> {
private A a = new A();
T test() {
return this.a.<T>test();
}
}
這樣,您不需要傳遞通用A#test()
function 參數 class 參數,該參數可能在運行時未使用。 當然,如果你確實在運行時使用了classOfT
,那么這個解決方案對你來說可能不是那么有趣......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.