【问题标题】:Convert from Class<T> to TypeReference<T>从 Class<T> 转换为 TypeReference<T>
【发布时间】:2012-12-06 19:09:34
【问题描述】:

基本上正好相反of this question。我想将 Class 对象转换为 TypeReference 对象。

我试过了:

foo(Class<T> valueType)
{
   TypeReference ref = new TypeReference<T>(){}; 
}

但这只是返回类的超类的类型引用。我也试过了:

foo(Class<T> valueType)
{
   TypeReference ref = new TypeReference<valueType>(){}; 
}

foo(Class<T> valueType)
{
   TypeReference ref = new TypeReference<valueType.getRawClass()>(){}; 
}

但后两个不编译。我该怎么做?

【问题讨论】:

  • 你能发布你传递给 foo 的什么类作为参数,你希望得到什么?

标签: java class generics jackson


【解决方案1】:

您可以覆盖 getType() 以返回您的类型:

new TypeReference<T>(){
    @Override
    public Type getType() {
        return valueType;
    }
}; 

【讨论】:

    【解决方案2】:

    正如其他人指出的那样,您很可能正在解决错误的问题。 您可能想要统一的实际上是JavaType,因为这是您的两个输入都被转换为的内容,而这也是杰克逊内部用于所有内容的内容。 然后你可以有方便的方法来到达JavaType

    【讨论】:

      【解决方案3】:

      我想将 Class 对象转换为 TypeReference 对象。

      也许可以做到这一点,但我想不出它可以解决任何现实问题。考虑来自TypeReference javadoc的信息

      这个类用于传递完整的泛型类型信息,并避免类型擦除问题(基本上从运行时类对象中删除大多数可用的类型引用)。

      我对此的解释是,当您需要 Class 对象可以提供的更多类型信息时,您唯一会使用 TypeReference 而不是 Class。所以即使你能弄清楚如何进行这种转换——你得到了什么?没有办法将擦除的类型信息从 Class 放回 TypeReference。

      每当我遇到需要 TypeReference 而不是 Class 的情况时,我都会创建一个具体的类型引用实例并在运行时传递该对象。像这样的东西(可能无法编译,但你明白了)

      foo(TypeReference<T> refArg)
      {
         TypeReference<T> ref = refArg; 
      }
      
      // later on
      object.foo(new TypeReference<List<Set<MyObject>>(){});
      

      【讨论】:

      • 它允许我提供对这两种方法的支持,而无需重写每个函数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多