5

我想在 Java 中从一个TypeReference<E>对象转到一个对象,而不使用强制转换。由于我的代码使用Jackson的方式,我需要使用对象,并且我需要对象,因为我想使用它来将类型推断到我的应用程序中的其他泛型类之一中。Class<E>TypeReferenceClass

我知道这TypeReference.getType()将返回一个java.lang.reflect.Type对象。基本上,如果我能找到一种无需强制转换即可使用代码的方法 from Typeto Class,那么我就找到了我的问题。

Javadoc 参考资料:

4

2 回答 2

11

你不能转换它:这是一个非常基本的 Java 问题——TypeReference 和 Class 不是从同一个基类派生的,所以它违反了语言定义。

但是,如果我猜对了您想要实现的目标,您可以使用以下方法转换原始(类型擦除)类JavaType

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

您可以JavaType使用TypeReferenceClass甚至只是基本的 JDK来构建Type

于 2012-11-01T00:03:44.980 回答
3

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

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

然而,这是一种框架方法。签名是完全类型保存的,它转换为一个包含所有“超级类型令牌”信息的类,Neal Gafter 在他的博客条目中提到,它传递了 TypeReference 的想法。这样可以使您的业务代码保持干净并输入保存。

然后用法会(在这里你看不到演员表......;-):

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

带输出(当然,即使代码显示字符串,实例也会被擦除...):

interface java.util.List
于 2012-10-31T21:04:29.793 回答