Java 在SharedReference中保存列表的常规类型
我想创建一个通用方法,用于将任何类型的列表保存到SharedReferenceJava 在SharedReference中保存列表的常规类型,java,generics,android-sharedpreferences,android,gson,Java,Generics,Android Sharedpreferences,Android,Gson,我想创建一个通用方法,用于将任何类型的列表保存到SharedReference public static List<T extends Object> readAnyTypeOfList<T>() { Gson gson = new Gson(); return (gson.fromJson(SharedPref.read("anyTypeOfList", "[]"), new TypeToken<L
public static List<T extends Object> readAnyTypeOfList<T>() {
Gson gson = new Gson();
return (gson.fromJson(SharedPref.read("anyTypeOfList", "[]"),
new TypeToken<List<T>>() {
}.getType()));
}
publicstaticlist readAnyTypeOfList(){
Gson Gson=新的Gson();
return(gson.fromJson(SharedPref.read)(“anyTypeOfList”、“[]”),
新的TypeToken(){
}.getType());
}
用于保存任何类型的列表
public static void saveAnyTypeOfList(List<T> value) {
Gson gson = new GsonBuilder().create();
JsonArray jsonArray = gson.toJsonTree(value).getAsJsonArray();
SharedPref.save("anyTypeOfList", jsonArray.toString());
}
public static void saveAnyTypeOfList(列表值){
Gson Gson=new GsonBuilder().create();
JsonArray JsonArray=gson.toJsonTree(value.getAsJsonArray();
save(“anyTypeOfList”,jsonArray.toString());
}
但这两种方法都有错误创建泛型方法的正确方法是什么。我也尝试过
工作示例在哪里
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());
}
公共静态ListOfModel=“ListKey”
公共静态列表readListOfModel(){
Gson Gson=新的Gson();
return(gson.fromJson(SharedPref.read(ListOfModel,“[]”)中,
新的TypeToken(){
}.getType());
}
公共静态void saveListOfModel(列表值){
Gson Gson=new GsonBuilder().create();
JsonArray JsonArray=gson.toJsonTree(value.getAsJsonArray();
save(ListOfModel,jsonArray.toString());
}
您不能像这样创建一个
TypeToken
T
被擦除,特定类型信息在运行时不可用,因此令牌中没有信息
您在声明泛型方法时犯的错误是,您从未声明类型变量T
。像这样:
public static <T> someMethod(T t) {...}
//............^^^
publicstaticsomemethod(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()));
}
public static void saveAnyTypeOfList(字符串键,列表值){
Gson Gson=new GsonBuilder().create();
JsonArray JsonArray=gson.toJsonTree(value.getAsJsonArray();
save(key,jsonArray.toString());
}
公共静态列表readAnyTypeOfList(字符串键,TypeToken tt){
Gson Gson=新的Gson();
返回(gson.fromJson(SharedPref.read(key,“[]”),tt.getType());
}
您不能像这样创建一个TypeToken
T
被擦除,特定类型信息在运行时不可用,因此令牌中没有信息
您在声明泛型方法时犯的错误是,您从未声明类型变量T
。像这样:
public static <T> someMethod(T t) {...}
//............^^^
publicstaticsomemethod(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()));
}
public static void saveAnyTypeOfList(字符串键,列表值){
Gson Gson=new GsonBuilder().create();
JsonArray JsonArray=gson.toJsonTree(value.getAsJsonArray();
save(key,jsonArray.toString());
}
公共静态列表readAnyTypeOfList(字符串键,TypeToken tt){
Gson Gson=新的Gson();
返回(gson.fromJson(SharedPref.read(key,“[]”),tt.getType());
}
这个方法是gson.toJsonTree(value.getAsJsonArray();必须或者简单调用gson.toString()就足够了List@Nepster我想您也可以调用gson.toJson(value)
来返回json字符串;必须或者简单调用gson.toString()就足够了List@Nepster我想您也可以调用gson.toJson(value)
,它返回json字符串。