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

我在这段代码片段中获得了一个“ types安全:从Object到ArrayList的未经检查的强制转换 ”警告,其中包含readObject()行:

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

Event是一个简单的类,包括一些字符串,日历,布尔值和整数。 在上面的镜像操作中使用ObjectOutputStream编写ArrayList 。 使用此代码的应用程序每天执行多次超过一个月没有失败,但编译器警告困扰我,我不想只是抑制它,如果它可以正确“检查”。

抑制它。 你唯一的另一种选择是转换为ArrayList,但是然后你的代码中的其他地方你必须处理无types的ArrayList并在读取时进行转换。 在这种情况下抑制没有害处。

那么编译器是正确的 – 谁说你正在读的对象真的是一个ArrayList? 我可以轻松地用完全不同的东西替换文件,你会得到一个例外。

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

应该管用。 是的,你仍然会因为generics而得到警告,但那时候是Java的通用系统,摆脱它会意味着创建一个新对象并一次添加一个事件 – 但是我们必须将对象转换为事件和..唉,不是没有更好,只是与通用警告一起生活。

旧的,但我同样的“谷歌得到了回应”。

如果你想避免它并且没有真正因CPU或RAM限制而被征税,你可以试试Collections.copy