如何获取类型参数对象的类名?
示例:if function is
public <T extends Base> void convert(final T arg) {}
public <T> void method2(Class<T> typeParamClass) {}
如何将arg作为Class<T>
传递给方法2?
尝试传递arg.getClass()
时出现错误消息Real Code Snippet
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());
}
答案 0 :(得分:3)
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
)。< / p>
正如Sotirios Delimanolis所指出的,T
在这里毫无意义,方法可以简单定义:
public void method2(Class<?> typeParamClass)
更新:
method2(object, object.getClass())
^^^
这里的主要问题是getClass()
是一个虚方法,返回实例的运行时类型。它不能保证从给定的Class<T>
返回T
,但可以? extends T
。要使其编译,您必须将签名更改为:
method2(T object, final Class<? extends T> typeParameterClass)
^^^
答案 1 :(得分:1)
如answer from Andrew中所述,问题是类型擦除。
您正在使用泛型getClass
T
收益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);
}