2013-05-27 3 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 

Я прочитал так много сообщений об этой проблеме, но я просто не могу заставить его работать на моем вопрос. Я продолжал стучать по этой проблеме в течение нескольких дней и просто не повезло! Я знаю, что это проблема, которую я испытываю, когда файл де-сериализуется. Как мне вернуть его прежний тип из 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 Generics: во время выполнения нет информации о параметрах типа, связанной с экземпляром. Вам придется жить с предупреждением или подавлять его аннотацией SuppressWarnings("Unchecked") на метод или выражение.

Кроме того, вы, кажется, запутались слепков против преобразований: а опущенными (это то, что вы там делаете) ничего не конвертировать, он просто позволяет объекту рассматриваться как если бы она была типа вы бросаете его. Ваш объект уже имеет тип ArrayList; ваш переменная имеет тип Object. Пожалуйста, научитесь ценить эти различия в Java, они необходимы для понимания и написания кода.

1

Я думаю, чтобы избежать предупреждений вы можете сделать следующие вещи:

alst = (ArrayList) o; 
    for (Object item : alst) { 
    if (!item instanceof Account) { 
     throw new IllegalArgumentException(); 
    } 
    } 
Смежные вопросы