/ / Подтипиране или Генерични в Java? - java, генерични, подтипи

Подтипиране или генериране в Java? - java, генерични, подтипове

Това е въпрос за задаване на Java, вероятно свързан с подтипиране и генерични. Имам клас, който се простира ArrayList наречени Редове

public class Rows extends ArrayList<List<Thing>> implements List<List<Thing>>{}

Трябва да го върна в друг клас, който има метод, който връща a List<List<Thing>>, затова трябва да направя това, за да получа желания тип връщане:

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;
}

Грешката, която Eclipse връща, е java.lang.ClassCastException: java.util.ArrayList не може да бъде хвърлен в пакет. Аз съм доста объркана, тъй като класът на редовете ми се разширява ArrayList и си помислих, че трябва да може да бъде хвърлен към него.

Отговори:

1 за отговор № 1
Rows extends ArrayList<List<Thing>>

Горното определение казва това Rows е подклас на ArrayList<List<Thing>> (което означава, че е специализирана версия), не че Rows е едно и също нещо като ArrayList<List<Thing>>.

Това означава, че a Rows е един вид ArrayList<List<Thing>> (така че преобличават), но ArrayList<List<Thing>> не е непременно a Rows (така че downcasting не работи).

Ако имате обект, който сте създали като new ArrayList<List<Thing>>, тогава това е неговият тип и вие не можете да го намалите още повече. Ако искате да можете да го използвате като Rows, просто трябва да го създадете като new Rows.

(Между другото, множествено число е нестандартно за имената на класовете.)