Това е въпрос за задаване на 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 за отговор № 1Rows 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
.
(Между другото, множествено число е нестандартно за имената на класовете.)