我让这段代码加载任何序列化数据:
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/