美文网首页
Gson对泛型的支持(TypeToken的使用)

Gson对泛型的支持(TypeToken的使用)

作者: 斑马搬码 | 来源:发表于2017-05-12 13:15 被阅读528次

原文

简单的例子:

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获取泛型的文章:

Java中定义泛型<T>时,怎么获得泛型的类型

Java为什么要添加运行时获取泛型的方法?

你会知道为什么TypeToken必须创建子类对象。

相关文章

网友评论

      本文标题:Gson对泛型的支持(TypeToken的使用)

      本文链接:https://www.haomeiwen.com/subject/opvztxtx.html