从TypeReference <e>转换为Class <e>而不转换(Java)</e> </e>

时间:2012-10-31 19:34:36

标签: java generics casting jackson

我希望从TypeReference<E>对象转到Java中的Class<E>对象,不使用使用转换。我需要TypeReference的使用,因为我的代码使用杰克逊的方式,我需要Class对象,因为我想用它来推断我的其他Generic中的一个类型我的应用中的课程。

我知道TypeReference.getType()将返回java.lang.reflect.Type个对象。基本上,如果我能找到一种方法来使用代码而无需强制转换从TypeClass,那么我就已经找到了问题。

Javadoc参考:

2 个答案:

答案 0 :(得分:7)

你不能强制转换它:这是非常基本的Java问题 - TypeReference和Class不是从相同的基类派生的,因此它违背了语言定义。

但如果我猜对了你想要实现的目标,你可以使用JavaType来转换原始(类型擦除)类:

JavaType type = mapper.getTypeFactory().constructType(ref);
Class<?> cls = type.getRawClass();

您可以从JavaTypeTypeReference或甚至只是基本的JDK Class构建Type

答案 1 :(得分:1)

没有铸造,我没有看到任何解决方案。但是,这是一种具有通用铸造的解决方案。也许这也有帮助:

public class Converter {
    public static <T> Class<T> convert(TypeReference<T> ref) {
        return (Class<T>)((ParameterizedType) ref.getType()).getRawType();
    }
}

然而,这是一种框架方法。签名是完全类型保存,它转换为包含所有“超类型令牌”信息的类,Neal Gafter在他的blog entry中提到了TypeReference的概念。通过它,它可以保持您的业务代码清洁并输入save。

然后使用(这里你看不到演员......; - ):

Class<List<String>> typ = Converter.convert(new TypeReference<List<String>>() {});
System.out.println(typ);

使用输出(当然,即使代码显示字符串,实例也是类型已经打开...):

interface java.util.List