在 SharedPreference 中保存通用类型的列表
save generic type of List in SharedPreference
我想创建一个通用方法来将任何类型的 List 保存到 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());
}
您不能像那样一般地创建 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()));
}
我想创建一个通用方法来将任何类型的 List 保存到 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());
}
您不能像那样一般地创建 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()));
}