未经检查的演员表警告 - 如何避免这种情况? [复制]

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

【讨论】:

以上是关于未经检查的演员表警告 - 如何避免这种情况? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin泛型未经检查的警告

生成签名 APK 时未经检查的演员表

类型安全:未经检查的演员表

避免在具有多种值类型的映射中进行未经检查的分配?

如何解决此未经检查的作业警告?

如何满足 Java 编译器设置 SimpleObjectProperty 的未经检查的警告