为了账号安全,请及时绑定邮箱和手机立即绑定

具有动态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条经验 获得超7个赞

从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 关注
  • 1014 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号