Jest to pytanie dotyczące przypisania Java, prawdopodobnie dotyczące typowania podrzędnego i generycznego. Mam klasę, która się rozszerza ArrayList
zwane Wierszami
public class Rows extends ArrayList<List<Thing>> implements List<List<Thing>>{}
Muszę go zwrócić w innej klasie, która ma metodę zwracającą a List<List<Thing>>
dlatego muszę to zrobić, aby uzyskać pożądany typ powrotu:
private List<List<Thing>> list;
public List<List<Thing>> rows() {
Rows r = (Rows) list;// But this cast does not work at runtime
return (List<List<Thing>>) r;
}
Błąd, który zwraca Eclipse java.lang.ClassCastException: java.util.ArrayList
nie można rzucić na pakiet. Wiersze. Jestem zdezorientowany, ponieważ moja klasa Rows się rozszerza ArrayList
i pomyślałem, że powinien być w stanie go rzucić.
Odpowiedzi:
1 dla odpowiedzi № 1Rows extends ArrayList<List<Thing>>
Powyższa definicja tak mówi Rows
jest podklasa z ArrayList<List<Thing>>
(co oznacza, że jest to wersja specjalistyczna), nie który Rows
jest tym samym co an ArrayList<List<Thing>>
.
Oznacza to, że a Rows
to rodzaj ArrayList<List<Thing>>
(więc działa upcasting), ale ArrayList<List<Thing>>
niekoniecznie jest Rows
(więc downcasting nie działa).
Jeśli masz obiekt, który utworzyłeś jako new ArrayList<List<Thing>>
, to jest jego typ i nie możesz go dalej spuszczać. Jeśli chcesz mieć możliwość używania go jako Rows
, po prostu musisz go utworzyć jako new Rows
.
(Przy okazji, liczba mnoga jest niekonwencjonalna dla nazw klas.)