public void wahey(List<Object> list) {}
wahey(new LinkedList<Number>());
Der Aufruf der Methode wird nicht überprüft. Ich kann nicht einmal die Parameter wirft wie folgt:Warum ist die Liste <Number> kein Untertyp der Liste <Object>?
wahey((List<Object>) new LinkedList<Number>());
Aus meiner Forschung hat ich gesammelt, dass der Grund für die nicht erlaubt ist die Typsicherheit. Wenn wir durften die oben genannten tun, dann könnten wir folgende Voraussetzungen erfüllt sein:
List<Double> ld;
wahey(ld);
innerhalb der Methode Wahey, konnten wir einige Strings in die Eingabeliste hinzuzufügen (wie die Parameter einen List<Object>
Referenzhält). Nach dem Aufruf der Methode verweist ld jetzt auf eine Liste mit dem Typ List<Double>
, aber die eigentliche Liste enthält einige String-Objekte!
Dies scheint anders als die normale Art und Weise Java ohne Generika funktioniert. Zum Beispiel:
Object o;
Double d;
String s;
o = s;
d = (Double) o;
Was wir hier tun, ist im Wesentlichen der gleiche, außer diese Kompilierung-Kontrollen passieren und nur zur Laufzeit fehlschlagen. Die Version mit Listen wird nicht kompiliert.
Dies führt zu der Annahme, dass dies eine rein konstruktive Entscheidung in Bezug auf die Typenzulassung von Generika ist. Ich hatte gehofft, einige Kommentare zu dieser Entscheidung zu bekommen?
verwandt (kein exaktes Duplikat, obwohl die richtige Antwort im Grunde die gleiche ist): http: // stackoverflow.com/questions/251298/why-is-someclass-super-t-nicht-äquivalent-zu-someclasst-in-java-generischen-types – Kip
Der Begriff der Kunst ist ** Kovarianz ** - ich erwähne dies, weil es macht es ist einfacher für Sie, es nachzuschlagen, einschließlich Stack Overflow (wenn Sie sehen möchten, was ich dazu zu sagen hatte - im Kontext von C#, aber es gilt auch für Java - suchen Sie nach [covariance user: 95810] zum Beispiel). –
Ein Double Cast wie 'wahey ((Liste