从Class <t>转换为TypeReference <t> </t> </t>

时间:2012-12-06 19:09:34

标签: java class generics jackson

基本上恰恰相反of this question。我想转换一个Class&lt; T&gt;对象为TypeReference&lt; T&gt;对象

我试过了:

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()>(){}; 
}

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

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:5)

正如其他人所指出的,你可能正在解决错误的问题。 您可能希望统一的内容实际上是JavaType,因为这是您的两个输入转换为的内容,这就是杰克逊内部用于所有内容的内容。 然后,您可以使用便捷方法前往JavaType

答案 2 :(得分:1)

  

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

有可能这样做,但我想不出它解决的任何现实问题。请考虑TypeReference javadoc

中的此信息
  

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

我对此的解释是当您需要Class对象可以提供的更多类型信息时,唯一一次使用TypeReference而不是Class。所以即使你能弄清楚如何进行这种转换 - 你获得了什么?无法将类中已删除的类型信息放回TypeReference中。

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

foo(TypeReference<T> refArg)
{
   TypeReference<T> ref = refArg; 
}

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