在GSON中使用泛型

我正在使用GSON将JSON解码为T类型的对象,例如

public T decode(String json) {

Gson gson = new Gson();

return gson.fromJson(json, new TypeToken<T>() {}.getType());

}

但是,这将返回异常-

java.lang.AssertionError:意外的类型。预期为以下之一:java.lang.reflect.ParameterizedType,java.lang.reflect.GenericArrayType,但得到:sun.reflect.generics.reflectiveObjects.TypeVariableImpl,类型标记为:T

我认为通过使用TypeToken可以避免Type Erasure。

我错了吗?

谢谢

回答:

首先,我看不到像这样包装Gson有什么用。

对于您的问题,有关泛型类型T本身的信息在运行时不可用。它已被删除。它仅在编译时可用。您想使用实际类型来对其进行参数化,例如new

TypeToken<List<String>>

如您所见,由于Java中缺少经过修饰的泛型(不可能执行T t = new

T()),因此Gson本身被迫使用此TypeToken方法。否则,Gson会以一种更为优雅的方式做到这一点。

为了能够传递实际的类型,您必须重新发明与TypeToken已经做过的相同的事情。这是没有道理的:)只是重复使用它,或者直接使用Gson而不将其包装在这样的辅助类中。

以上是 在GSON中使用泛型 的全部内容, 来源链接: utcz.com/qa/416639.html

回到顶部