2013-05-27 57 views
0

我看不出我如何将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 

我看了一下这个问题这么多的职位,但我不能得到它的工作对我的问题。我一直在这个问题上喋喋不休,只是没有运气!我知道这是我对文件进行反序列化时遇到的问题。如何从对象中恢复到以前的类型?

还有别的办法吗?

+0

将ain.close放入finally语句或使用Java 7:http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – rethab

+1

您无法在此处进行类型安全性转换。编译器无法知道在磁盘上的文件中存储了什么类型,并且转换为'ArrayList '会很麻烦。只要压制警告。 – millimoose

回答

3

你的麻烦不向下转换成ArrayList,但进入ArrayList<Account>

如果没有未经检查的转换警告,则无法将其降频为通用类型。这是由于Java泛型的核心本质:在运行时没有与实例关联的类型参数信息。您将不得不忍受警告,或者在方法或表达式上使用SuppressWarnings("Unchecked")批注。

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

1

我想避开你可以下面的事做警告:

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