繁体   English   中英

不安全的强制转换问题,如何强制类型安全?

[英]Unsafe cast issue, How to cast typesafe?

我没有看到如何将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恢复到以前的类型?

还有其他办法吗?

您的麻烦不是向下转换为ArrayList ,而是向下转换为ArrayList<Account>

没有未经检查的强制转换警告,您不能将其转换为通用类型。 这是由于Java泛型的核心特性:在运行时,没有与实例关联的类型参数信息。 您将不得不忍受警告,或者在方法或表达式上使用SuppressWarnings("Unchecked")注释来取消警告。

另外,您似乎对转换与转换感到困惑: 向下转换 (这就是您在此处所做的事情)不会转换任何内容,它仅允许将对象视为与您转换为对象的类型相同的对象。 您的对象已经是ArrayList类型; 您的变量的类型为Object 请学习欣赏Java中的这些差异,它们对于理解和编写代码至关重要。

我认为为了避免警告,您可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM