2016-05-14 2 views
0

Я получаю ошибку «или небезопасные операции» в этом методе:или небезопасные операции на ObjectInputStream

public static MyClass initApp(){ 
     MyClass obj = new MyClass(); 
     try{ 
      ObjectInputStream oin = 
       new ObjectInputStream(new FileInputStream("file.dat")); 

      obj.setSomeList ((Map<String,MyOtherClass>) oin.readObject()); //error line 

     }catch(IOException e) 
      { System.out.println(e.getMessage()); } 
     catch(ClassNotFoundException e) 
      { System.out.println(e.getMessage()); } 

     return obj; 
    } 

Не Карта наиболее абстрактно, так как в этом случае возможно? Как я могу это решить?

Метод setSomeList (ПРИМЕЧАНИЕ Он находится в другом классе, если это помогает!):

public void setSomeList(Map<String,MyOtherClass> l){ 
     for(Map.Entry<String,MyOtherClass> entrada : l.entrySet()) 
      someList.put(entrada.getKey(),entrada.getValue().clone()); 
    } 
+2

Теперь вы считаете, что объект, считанный из потока, представляет собой карту . Вы должны дважды проверить класс объекта, прочитанного перед литьем. – CConard96

+0

@ CConard96 Как это сделать в среде «ObjectInputStream»? –

+0

ИДК, что происходит в вашей голове, но почему у пытается бросить oin.readObject(), можно сказать, у меня – emotionlessbananas

ответ

0

Это только предупреждение, вы можете просто игнорировать его, как это не мешает вашему приложению работать, если он не является правильным типа, если вы хотите, чтобы удалить его просто добавить @SuppressWarnings("unchecked") на уровне определения методы , как показано ниже:

@SuppressWarnings("unchecked") 
public static MyClass initApp(){ 
+0

Нет ли другого пути? –

+1

нет, потому что вы конвертируете объект в карту, это часть задания компилятора, чтобы предупредить вас о том, что он может потерпеть неудачу, но если вы знаете, что это безопасно, вы просто добавляете предупреждение, это способ сказать «ОК». знаю, что я делаю –

1

Вы должны проверить объекты типа перед заливкой.

Object theObject = obj.readObject(); 
if (theObject instanceof Map) 
{ 
    Map theMap = (Map) theObject; 
    objSetSomeList(theMap); 
} 
+0

Это не работает ... (такое же предупреждение) –

+1

Невозможно проверить типы ключей или значений в этой точке кода из-за стирания типа. Дополнительную информацию см. На странице http://stackoverflow.com/questions/7335018/cannot-perform-instanceof-check-against-parameterized-type-arraylistfoo. Лучшее, что вы можете сделать, это бросить на общий Map , получить первую запись, проверить типы ключей и значения с помощью instanceof. – CConard96

+0

Хорошо, понял. Спасибо;) –

Смежные вопросы