簡體   English   中英

如何將有界泛型類型參數類作為參數傳遞

[英]How to pass bounded generic type parameter class as argument

如何獲得類型參數對象的類名?

示例:如果函數是

public <T extends Base> void convert(final T arg) {}
public <T> void method2(Class<T> typeParamClass) {}

如何將arg作為Class<T>傳遞給方法2?

當我嘗試通過arg.getClass()時出現錯誤消息

實碼片段

static <T> byte[] method2(T object, final Class<T> typeParameterClass) throws SerializationException {
}


static <T> T method3(final byte[] serializedObject, final Class<T> typeParameterClass) throws SerializationException {
        return (T) serializer.deserialize(typeParameterClass, Buffers.toBuffer(serializedObject));
    }
}

public static <T> T clone(final T object) {
    return method3(method2(object, object.getClass()), object.getClass());
}

在此處輸入圖片說明

public <T> void method2(Class<T> typeParamClass)

如果使第二種方法通用,則可以像

public <T extends Base> void convert(final T arg) {
    method2(arg.getClass());
}

還有為不限制Tmethod2T extends Object ),所以你可以自由地通過任何T (包括T extends Base )。

正如Sotirios Delimanolis指出的那樣, T在這里實際上是沒有意義的,可以簡單地定義該方法:

public void method2(Class<?> typeParamClass)

更新:

method2(object, object.getClass())
                       ^^^

這里的主要問題是getClass()是一個虛擬方法,返回實例的運行時類型。 它不能保證從給定的T返回Class<T> ,但是? extends T ? extends T 為了使其編譯,您必須將簽名更改為:

method2(T object, final Class<? extends T> typeParameterClass)
                              ^^^

安德魯(Andrew)回答中所述,問題是類型擦除。

您正在使用泛型, T getClass產生Class<?> ,而不是Class<T>

但是,由於我們知道T的類型將始終為Class<T> ,因此可以將object.getClassClass<T> ,因此不必使用冗余參數更改方法簽名。

所以你可以這樣寫:

public static <T> T clone(final T object) {
    @SuppressWarnings("unchecked") // The type of 'object' will always be 'T'
    Class<T> typeClass = (Class<T>) object.getClass();

    return method3(method2(object, typeClass), typeClass);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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