Ostrzeżenie przy deserializacji ArrayListy

0

Dodałem kilka obiektów do ArrayListy:

ArrayList<Pojazd> parking=new ArrayList<>();

która jest zapisywana do pliku.

void exportArrayListy() throws IOException{
    FileOutputStream fo=new FileOutputStream("arraylista.ser");
    ObjectOutputStream oo=new ObjectOutputStream(fo);
    oo.writeObject(parking);
    oo.close();
    parking=null;
}

Kompilator pokazuje jednak ostrzeżenie

warning: unchecked cast parking=(ArrayList)oi.readObject(); required: ArrayList found: Object

gdy dokonuję przypisania zapisanego obiektu z powrotem do zmiennej typu ArrayList<Pojazd>

void importArrayListy() throws IOException, ClassNotFoundException{
    FileInputStream fi=new FileInputStream("arraylista.ser");
    ObjectInputStream oi=new ObjectInputStream(fi);
    parking=(ArrayList<Pojazd>)oi.readObject();
    oi.close();
}

Wszystko jest w try/catch i generalnie się kompiluje, jednak czy da się przerobić ten kod na taki, który nie będzie obwarowany ostrzeżeniem?

0

A dlaczego nie tak?

ArrayList<Pojazd> parking = new ArrayList<Pojazd>();
0

@autor niestety nie da rady bo ze streama czytasz Object.

0
bogdans napisał(a):

A dlaczego nie tak?

ArrayList<Pojazd> parking = new ArrayList<Pojazd>();

Bo ty jestes starodawny i nie uzywasz 'diamond operator' z Javy 7, a autor posta owszem.

@autor - problemem jest rzutowanie na typ generyczny, tego nie da sie ominac. Mozesz dodac tylko @SuppressWarnings zeby to uciszyc. Ot, jedna z pieknosci genericow javy.

0

@bogdans - to nie ma zadnego zwiazku z pytaniem.

0

NetBean wskazywał w tym miejscu:

redundant type arguments in new expression, use diamond operator instead

Jednak niezależnie od tego, kompilator wyrzuca ww. ostrzeżenie.

0

Dziękuję za odpowiedź :) Już wszystko jasne.

1
@SuppressWarnings("unchecked")
void importArrayListy() throws IOException, ClassNotFoundException{
    FileInputStream fi=new FileInputStream("arraylista.ser");
    ObjectInputStream oi=new ObjectInputStream(fi);
    parking=(ArrayList<Pojazd>)oi.readObject();
    oi.close();
}

albo (nieco clumsy, ale cala java taka jest):

void importArrayListy() throws IOException, ClassNotFoundException{
    FileInputStream fi=new FileInputStream("arraylista.ser");
    ObjectInputStream oi=new ObjectInputStream(fi);
    @SuppressWarnings("unchecked")
    ArrayList<Pojazd> tmp = (ArrayList<Pojazd>)oi.readObject();
    parking=tmp;
    oi.close();
}

Wynika to z tego, ze mozna dac anotacje na metody lub deklaracje zmiennych.

Swoja droga, powinienes uzyc List<Pojazd> a nie ArrayList<Pojazd>, nalezy do 'good practices'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1