List<?> i ObjectInputStream

0

public void Odczyt(List<?> obj){
try {
FIS = new FileInputStream("c:\plik");
OIS = new ObjectInputStream(FIS);
obj.clear();
while((O = OIS.readObject())!=null){
obj.add(O); - tu jest problem
}
OIS.close();
FIS.close();
gdzie O jest typu Object. FIS - file input stream, OIS - object input stream
Niestety to nie działa... jak zrobić żeby dało się dodawać obiekty do tej listy? Jeśli stworzę Odczyt(List<Object>) niestety dostaję informację, że nie da się rzutować mojej klasy do Object.

0

Być może w strumieniu jest zserializowany prymityw typu np int i nie jest automatycznie boxowany.

0

Niestety w tej klasie mam 2 zmienne int i jednego floata (nie licząc pozostałych 20 obiektowych zmiennych). Można to jakoś prosto obejść, nie zmieniając inta na Integera?

0

Wczytuj/ zapisuj całą klasę, a nie pojedynczo składowe.

0

Problem jest bardziej z dodawaniem do List<?>. Jak dodać do takiej listy?

0

Do List<?> nie da sie dodac, musisz miec np. List<? super Object>.

0

To jest raczej niezgodne z generykami w Javie. Musisz mieć jakiś typ.

Podaj stacktrace. Zapewne błąd jest przy wywołaniu metody readObject, a nie List.add.

0
Wibowit napisał(a)

To jest raczej niezgodne z generykami w Javie. Musisz mieć jakiś typ.

Dupa, sam jestes niezgodny. Prosze, oto kod, skompiluj i uruchom. Kod idzie nawet o wiele dalej, definiuje generyczna metode.

import java.util.*;


    class Test {
        public static void main(String[] args) {
            List<? super Object> lo = new ArrayList<Object>();
            List<? super String> ls = lo;
            add(lo, "str");
            System.out.println(lo.size());
            add(ls, "str");
            System.out.println(lo.size());
}

    public static <T> void add(List<? super T> sink, T item) {
        sink.add(item);
    }
}
0

A ten jeszcze dalej, pokazuje jak kompilator dokonal inferencji typow:

import java.util.*;


class Test {
    public static void main(String[] args) {
        List<? super Object> lo = new ArrayList<Object>();
        List<? super String> ls = lo;
        Object o = add(lo, "str");
        System.out.println(lo.size());
        String s = add(ls, "str");
        System.out.println(lo.size());
    }

    public static <T> T add(List<? super T> sink, T item) {
        sink.add(item);
        return item;
    }
}
0

Okay mistrzu, na chwilę zapomniałem o kontrawariancji, ale to chyba dlatego, że stosowanie ? super Object jest bezsensowne.

Edit:
Fail :D Gdy dodawałem swojego poprzedniego posta, to jeszcze twojego z tym super nie widziałem.

0

Dzięki za pomoc. Skomplikowane to, ale działa. Przyznam się, że pomimo paru już lat robienia w javie, a nie używałem List<? super cośtam> :)

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