java - 通用反序列化

标签 java

我试图用更通用的方法替换一些旧代码,因此我尝试使用泛型。不幸的是,到目前为止我还没有让它工作。我必须从 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;
        }

最佳答案

老实说,这是一个很难简明回答的问题,因为(建设性和客观地)您遗漏了泛型如何工作的一些基本概念。

cClass 的一个实例,它和其他任何东西一样都是 Object。通用类型参数必须是类型,而不是对象。如果您想对 HashMap 类型施加约束,您必须以泛型类型参数的形式表达这些约束。例如:

public static <T> HashMap<String,T> getEntries (Context context, Type type) {
    HashMap<String,T> hm = new HashMap<String,T>();
    ...
}

但是,由于无法从任何参数推断类型 T,因此 TClass 不是现成可用的方法内。一个典型的方法是添加一些有用的参数,这些参数也可以约束类型,例如:

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/

相关文章:

java - Java中的乘法运算导致负值

Java 操作执行不工作

java - 配置 apache james 2.3.2 以支持 ssl : NoSuchAlgorithmException 时出错

java - 如何在 Spark 中使用 RowReaderFactory

java - 复合键未由相应的 ID 填充

java - Spring - 从 xml 到 Java 配置

java - java中长整型转为字符串

java - 创建实现 Serialized/Parcelable 的 Firebase POJO 类

java - 为什么有时位图是相同的对象?

java - 无法理解Java溢出和编译错误逻辑