Java 在SharedReference中保存列表的常规类型

Java 在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

我想创建一个通用方法,用于将任何类型的列表保存到SharedReference

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字符串。