在方法调用中转换为动态类崩溃

时间:2015-10-25 17:57:27

标签: java class serialization

我有这段代码加载任何序列化数据:

public static <T> T loadData(String filename) {
        T o = null;
        try {
            FileInputStream fi = new FileInputStream(filename);
            ObjectInputStream oi = new ObjectInputStream(fi);
            o = (T) oi.readObject();
            oi.close();
            fi.close();
        } catch (Exception e) {}
        return o;
    }

我称之为:

ArrayList<String> data = loadData("a.dat");

但是在这个文件中我有另一个序列化对象(例如java.util.File对象)。 我预计o = (T) oi.readObject();会出现错误,但会在方法调用中崩溃。 为什么呢?

编辑:使用以下代码解决了问题:

public static <T> T loadData(Class<T> expectedClass, String filename) {
        T o = null;
        try {
            FileInputStream fi = new FileInputStream(filename);
            ObjectInputStream oi = new ObjectInputStream(fi);
            o = expectedClass.cast(oi.readObject());
            oi.close();
            fi.close();
        } catch (Exception e) {}
        return o;
    }

1 个答案:

答案 0 :(得分:3)

T是一种通用类型,并且已被删除&#34;在运行时。因此,在运行时,T实际上只是Object,并且有效。

只有在您调用它并尝试将其强制转换为ArrayList<String>时,才会尝试实际投射,并失败。

因此,您的IDE应该向您显示&#34;未选中&#34;或者&#34;不安全&#34;对强制类型转换为通用类型的警告。 (此行:o = (T) oi.readObject();

另请参阅:https://docs.oracle.com/javase/tutorial/java/generics/erasure.html