簡體   English   中英

獲取泛型類型的 class 的類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM