21

基本上正好与这个问题相反。我想将 Class<T> 对象转换为 TypeReference<T> 对象。

我试过了:

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

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

4

3 回答 3

24

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

new TypeReference<T>(){
    @Override
    public Type getType() {
        return valueType;
    }
}; 
于 2012-12-06T19:14:32.327 回答
6

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

于 2012-12-07T01:58:24.643 回答
1

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

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

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

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

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

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

// later on
object.foo(new TypeReference<List<Set<MyObject>>(){});
于 2012-12-06T19:51:26.187 回答