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
将非常繁重。只需抑制警告。