Ich habe diese Themen durchgearbeitet
Ich scheine jedoch immer noch irgendwie mit dem superSchlü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 Objectsollte passen (da es das Elternteil von ist Number) und Integersollte 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?