Ich habe diese Themen durchgearbeitet
Ich scheine jedoch immer noch irgendwie mit dem super
Schlüsselwort verloren zu sein :
Wenn wir eine solche Sammlung deklarieren:
List<? super Number> list = null; list.add(new Integer(0)); // this compiles list.add(new Object()); // this doesn't compile
sollte es nicht das Gegenteil sein - wir haben eine Liste, die einige Objekte (unbekannten Typs) enthält, deren Eltern Eltern sind Number
. Also Object
sollte passen (da es das Elternteil von ist Number
) und Integer
sollte nicht. Das Gegenteil ist aus irgendeinem Grund der Fall.
Vorausgesetzt, wir haben den folgenden Code
static void test(List<? super Number> param) { param.add(new Integer(2)); } public static void main(String[] args) { List<String> sList = new ArrayList<String>(); test(sList); // will never compile, however... }
Es ist unmöglich, den obigen Code zu kompilieren (und meine Vernunft legt nahe, dass dies das richtige Verhalten ist), aber die grundlegende Logik könnte das Gegenteil beweisen:
String is Object, Object is superclass of Number. So String should work.
Ich weiß, das ist verrückt, aber ist das nicht der Grund, warum sie keine <S super T>
Konstrukte zugelassen haben? Wenn ja, warum <? super T>
ist das dann erlaubt?
Könnte mir jemand helfen, den fehlenden Teil dieser Logikkette wiederherzustellen?