List<?> i ObjectInputStream

Odpowiedz Nowy wątek
2011-07-06 23:18
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.

Pozostało 580 znaków

2011-07-06 23:33
0

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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-07-07 00:48
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?

Pozostało 580 znaków

2011-07-07 11:37
0

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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-07-07 18:54
0

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

Pozostało 580 znaków

2011-07-07 19:02
::.
0

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

Pozostało 580 znaków

2011-07-07 19:09
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-07-07 23:12
::.
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);
    }
}

Pozostało 580 znaków

2011-07-07 23:14
::.
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;
    }
}

Pozostało 580 znaków

2011-07-07 23:45
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-07-07 23:46

Pozostało 580 znaków

2011-07-08 21:39
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> :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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