亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有動態ArrayList項目類型的GSON TypeToken

具有動態ArrayList項目類型的GSON TypeToken

森林海 2019-07-05 14:36:57
具有動態ArrayList項目類型的GSON TypeToken我有個密碼:Type typeOfObjectsList = new TypeToken<ArrayList<myClass>>() {}.getType(); List<myClass> objectsList = new Gson().fromJson(json, typeOfObjectsList);它將JSON字符串轉換為List物體。但現在我想要這個ArrayList具有動態類型(不僅僅是myClass),在運行時定義。這個ArrayList項目類型將用反射.我試過這個:    private <T> Type setModelAndGetCorrespondingList2(Class<T> type) {         Type typeOfObjectsListNew = new TypeToken<ArrayList<T>>() {}.getType();         return typeOfObjectsListNew;     }但不管用。這是例外:java.sql.SQLException: Fail to convert to internal representation: {....my json....}
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

從gson2.8.0開始,您可以使用TypeToken#getParameterized(Type rawType, Type... typeArguments)若要創建TypeToken,然后getType()應該能行。

例如:

TypeToken.getParameterized(ArrayList.class, myClass).getType()


查看完整回答
1 反對 回復 2019-07-05
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

您提議的語法無效。以下內容

new TypeToken<ArrayList<Class.forName(MyClass)>>

無效,因為您試圖傳遞一個方法調用,其中需要類型名稱。

以下內容

new TypeToken<ArrayList<T>>()

由于泛型(類型擦除)和反射的工作方式不可能實現。整體TypeToken黑客工作是因為Class#getGenericSuperclass()執行以下操作

返回表示由該類表示的實體(類、接口、原始類型或空)的直接超類的類型。

如果超類是參數化類型,則返回的Type對象必須準確地反映源代碼中使用的實際類型參數。

換句話說,如果它看到ArrayList<T>,那是ParameterizedType它將返回,您將無法提取類型變量的編譯時值。T應該會的。

TypeParameterizedType都是接口。您可以提供自己實現的實例。


查看完整回答
反對 回復 2019-07-05
  • 3 回答
  • 0 關注
  • 1036 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號