类型安全:未选中从对象到 ArrayList 的强制转换<MyVariable>

下面是将 ArrayList 从服务器发送到客户端的程序的一部分。我想删除有关此代码中最后一行的警告:

客户端代码:

Socket s;
(...)
// A server is sending a list from the other side of the link.
ois = new ObjectInputStream(s.getInputStream());
MyList = (ArrayList<MyVariable>) ois.readObject();

MyVariable是一个具有一些属性的Java类。服务器正在创建一个 ArrayList,并用 MyVariable 变量作为项填充它。然后,它将完整列表发送给客户端。

我想知道为什么我在那里有一个警告,以及如何完美地编码以获得0警告。如果可能的话,我想避免使用“@SuppressWarnings(”unchecked“)”。;)

谢谢

路易斯


答案 1

试试这个

Object obj = ois.readObject();
// Check it's an ArrayList
if (obj instanceof ArrayList<?>) {
  // Get the List.
  ArrayList<?> al = (ArrayList<?>) obj;
  if (al.size() > 0) {
    // Iterate.
    for (int i = 0; i < al.size(); i++) {
      // Still not enough for a type.
      Object o = al.get(i);
      if (o instanceof MyVariable) {
        // Here we go!
        MyVariable v = (MyVariable) o;
        // use v.
      }
    }
  }
}

答案 2

无法避免此警告。 返回一个对象。你需要投掷它。转换为泛型类型将始终生成此类警告。readObject()

如果你想让你的代码尽可能干净,这是一个好主意,你应该尊重Java命名约定,并使变量名称以小写字母开头。


推荐