/ / Podtyping czy Generics w Javie? - java, generics, subtyping

Subtyping lub Generics w Javie? - java, generics, subtyping

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 № 1
Rows 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.)