2012-12-06 71 views
7

基本上恰好相反of this question。我想将一个类<T>对象转换为TypeReference <T>对象。从类别<T>转换为类型参考<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()>(){}; 
} 

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

+0

你可以发表什么课你传给foo作为参数吗?你期望得到什么? – hoaz

回答

9

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

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

我想一个类对象转换为TypeReference对象。

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

此类用于传递完全泛型类型信息这一信息,并避免与类型擦除问题(即基本上去除运行时类对象最可用类型的参考文献)。

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

任何时候我有一个情况,我需要一个类型引用而不是类,我创建一个具体的类型引用实例,并在运行时传递该对象。像这样的东西(可能不会编译,但你明白了)

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

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

它允许我提供两种方法的支持,而不必重写每个函数 – Jason

5

正如其他人指出的那样,你很可能正在解决错误的问题。 你可能想要统一的对象实际上是JavaType,因为这就是你的两个输入都被转换成的东西,这就是杰克逊内部所用的一切。 然后你可以有便利的方法去JavaType

相关问题