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

Java 不安全的强制转换问题,如何强制转换类型安全?,java,serialization,Java,Serialization,我不知道如何将对象转换为ArrayList,因为我序列化了它,它的类型是ArrayList。在我看来,这段代码应该可以工作 当前反序列化代码: ArrayList<Accounts> alst = new ArrayList<Accounts>(); try { ObjectInputStream ain = new ObjectInputStream(new BufferedInputStream(new FileInputStream("accounts.ser"

我不知道如何将
对象
转换为
ArrayList
,因为我序列化了它,它的类型是
ArrayList
。在我看来,这段代码应该可以工作

当前反序列化代码:

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();
}
ArrayList alst=new ArrayList();
试一试{
ObjectInputStream ain=新的ObjectInputStream(新的BufferedInputStream(新的FileInputStream(“accounts.ser”));
对象o=ain.readObject();
如果(o ArrayList的instanceof){
alst=(ArrayList)o;
}
否则{
System.out.println(“大问题!!!”);
}
ain.close();
}
我明白了这个问题:

warning: 
[unchecked] unchecked cast
required: ArrayList<Account>.
found:    Object
警告:
[未选中]未选中的强制类型
必需:ArrayList。
发现:对象
我已经读了很多关于这个问题的帖子,但我就是不能让它在我的问题上发挥作用。我已经在这个问题上苦思冥想了好几天,只是运气不好!我知道这就是我在反序列化文件时遇到的问题。如何从Object将其恢复到以前的类型


还有别的办法吗?

我想,为了避免警告,你可以做以下事情:

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

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

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

您的问题不是降级到
ArrayList
,而是降级到
ArrayList

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


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

您的问题不是向下转换到
ArrayList
,而是转换到
ArrayList

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


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

将ain.close放在finally语句中或使用Java 7:这里不能进行类型安全转换。编译器无法知道磁盘上的文件中存储的是什么类型,转换到
ArrayList
将非常繁重。只需抑制警告,将ain.close放在finally语句中,或者使用Java7:这里不能执行类型安全转换。编译器无法知道磁盘上的文件中存储的是什么类型,转换到
ArrayList
将非常繁重。只需抑制警告。