未经检查的演员表警告 - 如何避免这种情况? [复制]
Posted
技术标签:
【中文标题】未经检查的演员表警告 - 如何避免这种情况? [复制]【英文标题】:unchecked cast warning - how to avoid this? [duplicate] 【发布时间】:2011-03-05 03:56:04 【问题描述】:我在 readObject() 行中收到“类型安全:未检查的从 Object 转换为 ArrayList”警告,在这段代码 sn-p:
// 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
是一个简单的类,由一些字符串、日历、布尔值和整数组成。 ArrayList
是使用 ObjectOutputStream 在上述镜像操作中写入的。使用此代码的应用程序每天执行多次,持续了一个多月,没有失败,但编译器警告困扰着我,如果可以正确“检查”它,我不想仅仅抑制它。
【问题讨论】:
你为什么不想压制它?您显然确信它是完全合法的,所以只需关闭编译器即可:) 黑客/变通办法只会使代码更难维护。 【参考方案1】:压制它。您唯一的另一种选择是强制转换为 ArrayList,但是在代码中的其他任何地方,您都必须处理无类型的 ArrayList 并在读取时强制转换。在这种情况下压制是没有坏处的。
【讨论】:
【参考方案2】:那么编译器是正确的——谁说你正在读取的对象真的是一个 ArrayList?我可以很容易地用完全不同的东西替换文件,你会得到一个例外。
Object obj = ois.readObject();
if (obj instanceof ArrayList)
// do something
else
// Error
应该可以。是的,由于泛型,您仍然会收到警告,但那是 Java 的泛型系统,摆脱它意味着创建一个新对象并一次添加一个事件 - 好吧,但是我们必须将 Objects 转换为事件和.. 啊,没有更好,只是忍受一般的警告。
【讨论】:
【参考方案3】:旧的,但我还是一样的“由 Google 到这里”回复。
如果您想避免这种情况,并且不会因为 CPU 或 RAM 限制而真正受累,您可以尝试 Collections.copy
【讨论】:
以上是关于未经检查的演员表警告 - 如何避免这种情况? [复制]的主要内容,如果未能解决你的问题,请参考以下文章