当前位置: 首页 > 面试题库 >

Java具有动态ArrayList项类型的Gson TypeToken

暨修洁
2023-03-14
问题内容

我有以下代码:

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....}


问题答案:

你提出的语法无效。下列

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

之所以无效,是因为你试图传递期望类型名称的方法调用。

下列

new TypeToken<ArrayList<T>>() 

由于泛型(类型擦除)和反射的工作方式,因此无法实现。整个TypeToken黑客工作,因为Class#getGenericSuperclass()以下

返回表示该类表示的实体的直接超类的Type(类,接口,原始类型或void)。

如果超类是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。

换句话说,如果看到ArrayList<T>ParameterizedType那么它将返回,并且你将无法提取类型变量T本应具有的编译时间值。

Type和ParameterizedType都是接口。你可以提供自己的实现的实例。



 类似资料:
  • 我有这个代码: 我试过这个: 但不管用。这是一个例外:

  • 问题内容: 所以我有一张地图: 我会像这样添加元素: 我有如下通用方法: 现在,这段代码可以很好地工作,并且没有编译器问题: 但是,当我尝试这样做时: 编译器向我显示以下警告:类型安全:通用方法verifyType(String,Class)的未经检查的调用verifyType(String,Class) 这让我感到困惑…请帮助… 问题答案: 更改: 至 通过仅将类型声明为“ Class”,就失去

  • 使用Gson库,我通过以下代码将JSON字符串转换为ArrayList对象: 您可以在第二段代码中看到,我使用反射来指定类的类型;但是对于第一段代码,我不知道如何使用反射指定列表的类型。 我该怎么办?!

  • 为什么Java可以推断出多个上限类型的共同祖先,而不能推断出下限类型的共同祖先? 更具体地说,请考虑以下示例:

  • 问题内容: 我想在嵌套的静态接口中使用泛型类。我的目标是做这样的事情: 但是我得到一个错误:无法对非静态类型T进行静态引用。如果进行一些更改(如下所述),我可以在接口内部使用泛型,但是我想避免使用此方法,因为编写同一个类两次:一次用于MyClass,一次用于MyInterface。 谢谢。 编辑 :我想这样做: 要么 问题答案: 静态嵌套类或嵌套接口(顺便说一句,始终是静态的)与其外部类(或接口)

  • 问题内容: 我了解使用(1),可以交换List接口的实现。似乎(1)通常在应用程序中使用,而不需要它(我自己总是使用它)。 我想知道是否有人使用(2)? 另外,这种情况实际需要多久(并且我可以举个例子),实际需要使用(1)而不是(2)(即,其中(2)不足以..除了对接口和最佳实践进行编码等之外) 问题答案: 几乎总是首选而不是首选,因为例如,可以将其转换为一个LinkedList而不会影响其余代码