Eine Instanz HashMap<String, String>
Matches Map<String, ?>
aber nicht Map<String, Object>
. Sagen Sie bitte, ein Verfahren schreiben möchten, die Karten von String
s alles akzeptiert: Wenn Sie
public void foobar(Map<String, Object> ms) {
...
}
Sie können keine HashMap<String, String>
liefern schreiben würde. Wenn Sie schreiben
public void foobar(Map<String, ?> ms) {
...
}
es funktioniert!
Eine Sache manchmal missverstanden in Java-Generika ist, dass List<String>
ist kein Untertyp von List<Object>
. (Aber String[]
ist in der Tat ein Subtyp von Object[]
, das ist einer der Gründe, warum Generika und Arrays nicht gut mischen. (Arrays in Java sind kovariant, Generika sind nicht, sie sind Invariante)).
Probe: Wenn Sie eine Methode schreiben möchten, die List
s von InputStream
s und Subtypen von InputStream
akzeptiert, dann würden Sie
public void foobar(List<? extends InputStream> ms) {
...
}
Durch die Art und Weise schreiben: Joshua Bloch's Effective Java ist eine hervorragende Ressource, wenn Sie Ich würde gerne die nicht so einfachen Dinge in Java verstehen. (Ihre obige Frage ist auch in dem Buch sehr gut abgedeckt.)
Siehe das offizielle Lernprogramm zu [Wildcards] (http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html). Es erklärt es gut und gibt ein Beispiel dafür, warum es notwendig ist, einfach Object zu verwenden. –