[英]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());
}
還有為不限制T
的method2
( T 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.getClass
為Class<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.