在SharedPreference中保存List的泛型类型

时间:2016-08-22 09:58:25

标签: java generics android-sharedpreferences android gson

我想制作一种将列表保存到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());
    }

1 个答案:

答案 0 :(得分:2)

您无法像这样创建TypeTokenT被删除,特定类型信息在运行时不可用,因此令牌中没有信息。

您在泛型方法声明中所犯的错误是您从未声明类型变量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()));
}