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.
Być może w strumieniu jest zserializowany prymityw typu np int i nie jest automatycznie boxowany.
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?
Wczytuj/ zapisuj całą klasę, a nie pojedynczo składowe.
Problem jest bardziej z dodawaniem do List<?>. Jak dodać do takiej listy?
Do List<?> nie da sie dodac, musisz miec np. List<? super Object>.
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.
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);
}
}
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;
}
}
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.
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> :)