【问题标题】:Convert from TypeReference<E> to Class<E> without casting (Java)从 TypeReference<E> 转换为 Class<E> 而不进行强制转换 (Java)
【发布时间】:2012-10-31 19:34:35
【问题描述】:

我想在 Java 中从 TypeReference&lt;E&gt; 对象转到 Class&lt;E&gt; 对象,没有使用强制转换。由于我的代码使用 Jackson 的方式,我需要使用 TypeReference 并且我需要 Class 对象,因为我想用它来推断我的应用程序中的其他泛型类之一的类型.

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

Javadoc 参考:

【问题讨论】:

  • Type 是一个接口,而不是一个对象,而Class 是Object 的子类。
  • 我知道。但我的问题是如何从TypeReference 转到Class。仅提及Type 接口,以防它帮助某人解决问题。
  • Type 不是代表没有任何类加载器信息的类型吗?因此,如果它指向类 Foo,它可能意味着由不同类加载器加载的任何实际 Foo 类?
  • 但从技术上讲,Class 实现了Type 接口,所以一个简单的演员应该可以完成这项工作。

标签: java generics casting jackson


【解决方案1】:

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

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

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

您可以从TypeReference、Class 甚至只是基本的 JDK Type 构建 JavaType。

【讨论】:

  • JavaType 来自哪个包/jar?
  • 没关系...它来自杰克逊。但是,我不确定您的 mapper 对象是什么类类型。不是ObjectMapper;我找不到ObjectMaper.getTypeFactory() 方法。相反,我从您那里得到的解决方案是TypeFactory.defaultInstance().constructType(typeReference).getRawClass()。谢谢。
  • ObjectMapper 有getTypeFactory()(参见fasterxml.github.com/jackson-databind/javadoc/2.1.0/com/…)但可能旧版本没有公开它。如果是这样,您可以使用 defaultInstance。
  • 等一下……那是 FasterXML 的 Jackson,而不是 Codehaus。哪个版本的杰克逊是官方的?
  • Jackson 从 Codehaus 存储库移至 GitHub 以获取 2.x。所以 Codehaus 有旧的(1.9),github 有新的。并且在com.fasterxml 下有新的Java 包。两者都是官方的,只是不同的 Java 包。
【解决方案2】:

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

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

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

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

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

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

interface java.util.List

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2019-06-29
    相关资源
    最近更新 更多