【问题标题】:How to cast Class<?> to Class<T>?如何将 Class<?> 转换为 Class<T>?
【发布时间】:2018-01-03 15:04:10
【问题描述】:

我有 Class&lt;?&gt; 字段的课程。我有一个方法,它必须在杰克逊的帮助下将字符串转换为对象。

private Class<?> myType = ...;
private String jsonRepresentationOfObject = ....;
ObjectMapper mapper = new ObjectMapper();

public <T> T get() {
   return mapper.readValue(jsonRepresentationOfObject, myType);
}

有没有可能将myType 转换为T?还是因为类型擦除而不可能?

【问题讨论】:

  • 你为什么不用Class&lt;MyType&gt;
  • @SilverNak 我有不同的类型,所以我不能使用它。
  • 签名&lt;T&gt; T get() 表示“我不在乎myType 是什么类型,我希望T”。你认为投射myType 会完成什么?
  • @JFPicard 这个问题与Difference between <? super T> and <? extends T> in Java 的重复究竟是什么?我发现它与事件无关。

标签: java generics casting jackson type-erasure


【解决方案1】:

由于类型擦除,这是不可能的。这就是为什么 Java 中的一些库函数让你传入一个除了执行.getClass() 之外什么都不用的类的实例。实际上,我现在正在编写非常相似的代码,最后我在(T returnType) 的类(相当于)上签名,然后在readValue 调用中,我传入returnType.getClass()

【讨论】:

    【解决方案2】:

    如果您绝对确定readValue 的结果将是T 类型,您可以这样做:

    public <T> T get() {
       return (T)mapper.readValue(jsonRepresentationOfObject, myType);
    }
    

    不过,您必须 @SuppressWarnings 进行未经检查的演员表。

    在其他语言中(例如可以与 Java 互操作的 Kotlin),您可以使用 reified generics,但由于类型擦除,它在 Java 中不存在。

    如果readValue的结果不是T,那么你会得到ClassCastException,所以要明智地使用它。

    【讨论】:

    • 如果 readValue 的结果不是T,那么你将得到一个ClassCastException。不必要。因此发出警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多