在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