Предупреждение без предупреждения - как этого избежать?

В этом фрагменте кода я получаю предупреждение "Тип безопасности: немедленный отбрасывание из объекта в объект ArrayList" в строке с readObject():

// Read the Event List
theEventArrayList = new ArrayList<Event>();        
String FILENAME = "EventData.dat";
FileInputStream fis;
try {
   fis = openFileInput(FILENAME);
   ObjectInputStream ois = new ObjectInputStream(fis);
   theEventArrayList = (ArrayList<Event>) ois.readObject(); 
   fis.close();
}

Event - это простой класс, состоящий из некоторых строк, календарей, булевых и ints. ArrayList записывается с использованием ObjectOutputStream в операции с зеркальным отображением в соответствии с приведенным выше. Приложение, в котором этот код используется, выполняется много раз в день в течение месяца без сбоев, но предупреждение компилятора беспокоит меня, и я не хочу просто подавлять его, если он может быть правильно проверен.

Ответ 1

Подавить его. Ваша единственная альтернатива - бросить в ArrayList, но тогда в вашем коде вам придется иметь дело с нетипизированным ArrayList и кастом на чтение. В этой ситуации нет никакого вреда в подавлении.

Ответ 2

Хорошо, компилятор прав - кто говорит, что объект, который вы читаете, действительно является ArrayList? Я мог бы легко заменить файл чем-то совершенно другим, и вы получите исключение.

Object obj = ois.readObject();
if (obj instanceof ArrayList) 
    // do something
else 
    // Error

должен работать. И да, вы все равно получите предупреждение из-за общего, но тогда эта общая система Java, избавившись от этого, будет означать создание нового объекта и добавление одного события за раз - ну, но тогда нам нужно было бы наложить объекты на События и.. argh, не лучше, просто живите с общим предупреждением.

Ответ 3

Старый, но мой же ol "Полученный здесь Google" ответ.

Если вы хотите избежать этого и на самом деле не облагаются налогом с ограничениями по ЦП или ОЗУ, вы можете попробовать Collections.copy