【问题标题】:save generic type of List in SharedPreference在 SharedPreference 中保存通用类型的 List
【发布时间】:2016-12-28 19:49:28
【问题描述】:

我想创建一个通用方法来保存任何类型的List to SharedPreference

public static List<T extends Object> readAnyTypeOfList<T>() {
        Gson gson = new Gson();
        return (gson.fromJson(SharedPref.read("anyTypeOfList", "[]"),
                new TypeToken<List<T>>() {
                }.getType()));
    }

用于保存任何类型的列表

public static void saveAnyTypeOfList(List<T> value) {
    Gson gson = new GsonBuilder().create();
    JsonArray jsonArray = gson.toJsonTree(value).getAsJsonArray();
    SharedPref.save("anyTypeOfList", jsonArray.toString());
}

但两种方法都给出错误。 创建泛型方法的正确方法是什么。我也试过this

工作示例在哪里

    public static ListOfModel = "ListKey"

    public static List<ModelClass> readListOfModel() {
        Gson gson = new Gson();
        return (gson.fromJson(SharedPref.read(ListOfModel, "[]"),
                new TypeToken<List<ModelClass>>() {
                }.getType()));
    }

    public static void saveListOfModel(List<ModelClass> value) {
        Gson gson = new GsonBuilder().create();
        JsonArray jsonArray = gson.toJsonTree(value).getAsJsonArray();
        SharedPref.save(ListOfModel, jsonArray.toString());
    }

【问题讨论】:

    标签: java generics android-sharedpreferences android gson


    【解决方案1】:

    您不能像这样创建TypeTokenT被擦除,具体的类型信息在运行时不可用,所以token中不会有信息。

    您在声明泛型方法时犯的错误是您从未声明过类型变量T。像这样:

    public static <T> someMethod(T t) {...}
    //............^^^
    

    (语法与C#不同)

    我的建议是这样做:

    public static <T> void saveAnyTypeOfList(String key, List<T> value) {
        Gson gson = new GsonBuilder().create();
        JsonArray jsonArray = gson.toJsonTree(value).getAsJsonArray();
        SharedPref.save(key, jsonArray.toString());
    }
    
    public static <T> List<T> readAnyTypeOfList(String key, TypeToken<List<T>> tt) {
        Gson gson = new Gson();
        return (gson.fromJson(SharedPref.read(key, "[]"), tt.getType()));
    }
    

    【讨论】:

    • 这个方法是gson.toJsonTree(value).getAsJsonArray();必须 。或者简单的调用 gson.toString() 就足以保存 List
    • @Nepster 我想你也可以调用 gson.toJson(value) 来返回 json 字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多