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

标签 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;
    }

最佳答案

T是通用类型,在运行时被“删除”。所以在运行时,T真的只是Object , 并且有效。

仅当您调用它并尝试将其强制为 ArrayList<String> 时是实际尝试的转换,但失败了。

因此,您的 IDE 应该在转换为通用类型时向您显示“未经检查”或“不安全”的警告。 (这一行:o = (T) oi.readObject();)

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

关于java - 转换为动态类在方法调用中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333008/

相关文章:

java - 命令行参数。

android,如何获取包名?

c++ - 通过命令行获取 C++ 库的类名

c++ - Boost序列化异常错误

java.lang.ClassCastException : scala. Tuple2 无法转换为 java.lang.Iterable

java - Hibernate两次向Join Table插入数据导致Spring Boot项目出现 "ORA-00001: unique constraint violated"

javascript - 获取javascript类中静态方法的值

php - 序列化数组或不序列化数组 : how to store a survey

java - 使用 Jackson JSON 反序列化和嵌套类?

java - 注释作为另一个注释的快捷方式?