未经检查的投射警告 - 如何避免这种情况?

2022-09-03 09:54:05

我收到一个“类型安全:未选中从对象到数组列表的强制转换”警告,在以下代码片段中,在readObject()行中:

// Read the Event List
theEventArrayList = new ArrayList<Event>();        
String FILENAME = "EventData.dat";
FileInputStream fis;
try {
   fis = openFileInput(FILENAME);
   ObjectInputStream ois = new ObjectInputStream(fis);
   theEventArrayList = (ArrayList<Event>) ois.readObject(); 
   fis.close();
}

Event是一个由一些字符串、日历、布尔值和整数组成的简单类。是在镜像操作中使用 ObjectOutputStream 写入上述内容的。使用此代码的应用程序每天执行多次,持续一个多月,没有失败,但是编译器警告困扰着我,如果可以正确“检查”它,我不想只是禁止它。ArrayList


答案 1

抑制它。您唯一的另一种选择是强制转换为ArrayList,但是在代码中的其他任何地方,您都必须处理非类型化的ArrayList并在读取时强制转换。在这种情况下,压制没有坏处。


答案 2

好吧,编译器是正确的 - 谁说你正在阅读的对象真的是ArrayList?我可以很容易地用完全不同的东西替换文件,你会得到一个例外。

Object obj = ois.readObject();
if (obj instanceof ArrayList) 
    // do something
else 
    // Error

应该工作。是的,由于泛型,你仍然会得到一个警告,但是这就是Java的泛型系统,摆脱它意味着创建一个新对象并一次添加一个事件 - 好吧,但是我们必须将对象转换为事件和..哎呀,不,不是更好,只是忍受一般的警告。


推荐