2012-12-06 96 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

相關問題