java - 在 SharedPreference 中保存通用类型的 List

标签 java generics android-sharedpreferences android gson

我想创建一个通用方法来保存任何类型的 共享首选项列表 .

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());
    }

最佳答案

您不能创建 TypeToken一般是这样的。 T被删除,具体的类型信息在运行时是不可用的,所以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()));
}

关于java - 在 SharedPreference 中保存通用类型的 List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39076502/

相关文章:

java - 如何解决 : compareTo >> cannot find symbol

Java - Action 监听器 : Get components from parent

java - 对通用集合进行排序

java - 静态/非静态内部类:类型参数T隐藏类型T

java - android:SharedPreferences不保存数据

Android - 字体共享首选项

android - 允许用户每 5 分钟最多发送 20 条评论?

java - 素数的数据模态不显示刷新数据表单支持bean

java - 如何检查 @Schedule 注释 (Spring 3.1) cron 作业是否正在运行。

java - 如何编写一个接受堆栈和队列的方法?