/ / Subtyping oder Generics in Java? - Java, Generika, Untertypen

Subtyping oder Generics in Java? - Java, Generika, Subtyping

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 № 1
Rows 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 RowsSie müssen es einfach als new Rows.

(Plural ist für Klassennamen übrigens unkonventionell.)