我试图用更通用的方法替换一些旧代码,因此我尝试使用泛型。不幸的是,到目前为止我还没有让它工作。我必须从 json 字符串动态加载对象的 HashMap 。但直到现在,我还没有让它工作,因为第 4 行
HashMap<String,c> hm = new HashMap<String,c>();
说“未知的 c 类”。我做错了什么?
public static HashMap<String,?> getEntries(Context context, Type t)
{
Class c = t.getClass();
HashMap<String,c> hm = new HashMap<String,c>();
try
{
File fl = new File(context.getCacheDir(),c.getClass().toString() + ".json");
FileInputStream fin = new FileInputStream(fl);
BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
fin.close();
hm = new Gson().fromJson(sb.toString(), t);
}catch(Exception i)
{
}
return hm;
}
最佳答案
老实说,这是一个很难简明回答的问题,因为(建设性和客观地)您遗漏了泛型如何工作的一些基本概念。
c
是 Class
的一个实例,它和其他任何东西一样都是 Object
。通用类型参数必须是类型,而不是对象。如果您想对 HashMap
类型施加约束,您必须以泛型类型参数的形式表达这些约束。例如:
public static <T> HashMap<String,T> getEntries (Context context, Type type) {
HashMap<String,T> hm = new HashMap<String,T>();
...
}
但是,由于无法从任何参数推断类型 T
,因此 T
的 Class
不是现成可用的方法内。一个典型的方法是添加一些有用的参数,这些参数也可以约束类型,例如:
public static <T> HashMap<String,T> getEntries (Context context, Type type, Class<T> clazz) {
HashMap<String,T> hm = new HashMap<String,T>();
...
}
有了这个,你可以这样调用:
HashMap<String,String> entries = getEntries(context, type, String.class);
并且您还可以根据需要在方法中使用clazz
。
希望这足以激励您朝着正确的方向前进。
关于java - 通用反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27138398/