Ich denke, ich vermisse hier etwas Grundlegendes. Jede Erklärung oder Hinweise auf zuvor gestellte Fragen werden sehr hilfreich sein.
%Vor% Es scheint also, als wäre eine List<String>
keine Unterklasse von List<Object>
, aber eine String[]
ist eine Unterklasse von Object[]
.
Ist das eine gültige Annahme? Wenn ja warum? Wenn nicht, warum?
Danke
Java-Arrays sind kovariant , d. h. sie erlauben Object[] foo = new String[2];
. Aber das bedeutet nicht, dass sie Unterklassen sind. String[]
ist eine Unterklasse von Object
(obwohl instanceof
wahr liefert, String[].class.getSuperclass()
gibt Object
zurück)
Ja, Ihre Annahme ist gültig. Wie von @ Bozho Arrays angegeben sind kovariant, während generische Sammlungen (wie generische Liste) nicht kovariant sind.
Kovarianz in Arrays ist riskant:
%Vor% Die dritte Zeile löst eine Laufzeitausnahme aus. Wenn diese Ausnahme nicht ausgelöst würde, könnten Sie eine String
Variable, s
, erhalten, die auf einen Wert verweist, der kein String
ist (noch ein Subtyp davon): a Date
.
String [] ist eine Unterklasse von Object []
Richtig, siehe 4.10.3 Untertypen zwischen Array-Typen :
Wenn S und T beide Referenztypen sind, dann S [] & gt; 1 T [] falls S & lt; 1 T.
Seit String >1 Object
so String[] >1 Object[]
Das heißt, String[]
ist ein direkter Subtyp von Object[]
Objekt & gt; 1 Objekt []
Dafür Object > String[]
; String[]
ist ein (indirekter?) Subtyp von Object
Es gibt keine solche Beziehung für Generika, also ist List<String> > List<Object>
nicht wahr.
Betrachten Sie nun das folgende einfache Beispiel:
%Vor% Es kompiliert nicht, weil x
allF
mit List<C>
aufruft, was nicht a List<I>
ist. Um List<C>
verwenden zu können, muss sich die Signatur leicht ändern:
Jetzt kompiliert es. Informell ist li
ein List
von einige -Typen, die I erweitern / implementieren. So ist List<C>
zu List<? extends I>
zuweisbar. Was Sie mit einer solchen Liste machen können, ist begrenzt. Im Wesentlichen können Sie lesen / darauf zugreifen, aber nicht write/modify
it.
Tags und Links java arrays collections