不安全的演员问题,如何施放类型安全?

时间:2013-05-27 10:03:41

标签: java serialization

我不知道如何将Object转换为ArrayList<Account>,就像我执行的序列化一样,它的类型为ArrayList<Accounts>。我认为这个代码应该可行。

当前反序列化代码:

ArrayList<Accounts> alst = new ArrayList<Accounts>();
try {
  ObjectInputStream ain = new ObjectInputStream(new BufferedInputStream(new FileInputStream("accounts.ser")));  
  Object o = ain.readObject();
  if(o instanceof ArrayList) {          
    alst = (ArrayList<Accounts>) o;
  }
  else {
    System.out.println("Big problem!!!");
  }

  ain.close();
}

我遇到了问题:

warning: 
[unchecked] unchecked cast
required: ArrayList<Account>.
found:    Object

我已经阅读了很多有关此问题的帖子,但我无法解决这个问题。我一直在坚持这个问题几天,没有运气!我知道这是我正在对文件进行反序列化的问题。如何从Object中将其恢复为以前的类型?

还有别的办法吗?

2 个答案:

答案 0 :(得分:3)

您的问题不是向下转移到ArrayList,而是向ArrayList<Account>转发。

如果没有未选中的强制转换警告,则无法向下转换为通用类型。这是由于Java Generics的核心特性:在运行时,没有与实例关联的类型参数信息。您将不得不接受警告,或使用方法或表达式上的SuppressWarnings("Unchecked")注释来禁止警告。

另外,你似乎对演员与转换感到困惑: downcast (你正在那里做的事情)不会转换任何东西,它只是允许对象被视为好像它是你投入的类型。您的对象已经是ArrayList类型;您的变量的类型为Object。请学习如何理解Java中的这些差异,它们对于理解和编写代码至关重要。

答案 1 :(得分:1)

我认为要避免警告你可以做以下事情:

  alst = (ArrayList) o;
  for (Object item : alst) {
    if (!item instanceof Account) {
      throw new IllegalArgumentException();
    }
  }