如何将有界泛型类型参数类作为参数传递

时间:2016-11-19 23:52:50

标签: java generics

如何获取类型参数对象的类名?

示例: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());
}

enter image description here

2 个答案:

答案 0 :(得分:3)

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

如果您将第二种方法设为通用,则可以像

一样调用它
public <T extends Base> void convert(final T arg) {
    method2(arg.getClass());
}

Tmethod2)中的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);
}