简单的例子:
List < Person > ps = gson.fromJson(str, new TypeToken < List < Person >> (){}.getType());
特别注意:
TypeToken在创建对象的时候(编译时)就要指明类型,以下情况是错误的:
public class ApiTask<T> {
private final Type mType;
private final Gson mGson;
public ApiTask() {
mType = new TypeToken<ResCommon<T>>() {
}.getType();
mGson = new Gson();
}
}
以上形式的代码在调用mGson.fromJson(json,mType)
方法时就会抛出如下异常:
Caused by: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xxx
正确的例子:
public class ApiTask {
private final Type mType;
private final Gson mGson;
public ApiTask( Type type ) {
mType=type;
mGson = new Gson();
}
}
//创建 TypeToken对象时,<>括号中的类型都是确定的
new ApiTask ( new TypeToken<ResCommon<ReqRider>>() {}.getType())
或者:
public class ApiTask<T> {
private final Type mType;
private final Gson mGson;
public ApiTask( TypeToken<ResCommon<T>> typeToken ) {
mType=typeToken.getType();
mGson = new Gson();
}
}
//使用
new ApiTask<>(new TypeToken<ResCommon<ReqRider>>(){});
参考地址:Strange behavior when deserializing nested, generic classes with GSON
有关Java获取泛型的文章:
你会知道为什么TypeToken必须创建子类对象。