簡體   English   中英

獲得通用類型的“真實”類

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

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