2016-08-22 47 views
0

我想製作一個通用的方法,用於將任何類型的列表保存到SharedPreference在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()); 
} 

的任何類型,但都methdos給錯誤。 什麼是創建通用方法的正確方法。我也曾嘗試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

不能創建一個TypeToken一般這樣。 T被刪除,特定的類型信息在運行時不可用,所以令牌中不會有任何信息。

您在聲明通用方法時發生的錯誤是您從未聲明類型變量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())); 
} 
+0

是這種方法gson.toJsonTree(值).getAsJsonArray() ;必須。或simpy調用gson.toString()足以保存列表 – Nepster

+0

@Nepster我想你也可以調用'gson.toJson(value)'返回json字符串。 –