Dies ist eine Java-Zuweisungsfrage, die möglicherweise Untertypen und Generika betrifft. Ich habe eine Klasse, die sich erweitert ArrayList
Rows genannt
public class Rows extends ArrayList<List<Thing>> implements List<List<Thing>>{}
Ich muss es in einer anderen Klasse zurückgeben, die eine Methode hat, die eine zurückgibt List<List<Thing>>
, also muss ich das tun, um den gewünschten Rückgabetyp zu erhalten:
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;
}
Der Fehler, den Eclipse zurückgibt, ist java.lang.ClassCastException: java.util.ArrayList
kann nicht in package.Rows umgewandelt werden. Ich bin ziemlich verwirrt, während sich meine Rows-Klasse erstreckt ArrayList
und ich dachte, dass es dazu in der Lage sein sollte.
Antworten:
1 für die Antwort № 1Rows extends ArrayList<List<Thing>>
Die obige Definition sagt das Rows
ist ein Unterklasse von ArrayList<List<Thing>>
(was bedeutet, dass es eine spezialisierte Version ist), nicht Das Rows
ist das gleiche wie ein ArrayList<List<Thing>>
.
Dies bedeutet, dass a Rows
ist eine Art von ArrayList<List<Thing>>
(so Upcasting funktioniert) aber ein ArrayList<List<Thing>>
ist nicht unbedingt ein Rows
(Downcasting funktioniert also nicht).
Wenn Sie ein Objekt haben, das Sie als erstellt haben new ArrayList<List<Thing>>
Dann ist dies sein Typ und Sie können ihn nicht weiter herunterwerfen. Wenn Sie ihn als verwenden möchten Rows
Sie müssen es einfach als new Rows
.
(Plural ist für Klassennamen übrigens unkonventionell.)