Ich lerne gerade Java Generics und versuche gerade, "Java Generics FAQ" zu finden.
Unter Frage (# 304) bezüglich des parametrisierten Wildcard-Typs irgendwie verwirrte mich, würde Ihre Hilfe schätzen.
Codebeispiel:
%Vor%Ich kann nicht herausfinden, warum unten zwei aufgerufene Methoden fehlschlagen:
%Vor%Danke
In OOP verwenden Sie Polymorphismus . Daher ist der Typ des Boxobjekts zur Kompilierungszeit Box<?>
Type<?>
Dies wird unbekannter Platzhalter genannt. Da Sie nicht wissen, welcher Boxtyp eingegeben wird, können Sie nur von diesem Objekt lesen, und Sie können nur die Objekte verwenden, die als Objektinstanzen gelesen werden. Deshalb ist box.put("xyz")
Fehler empfangen und String s = box.take()
ist Fehler erhalten.
Zweitens:
%Vor% equalTo
wird empfangen Box<T>
nicht Box<?>
. Wie ich oben erklärt habe, steht T für jede Klasse, aber ?
bedeutet nur unbekanntes Wildcard, diese beiden Begriffe sind nicht gleich.
Und ein anderer Punkt, den Sie wissen sollten. In Java ist generic zur Kompilierzeit. Kontrast zu anderen wie C #, generische ist zur Laufzeit.
Hier ist ein Verweis auf Wildcard: Java-Wildcard
Ich hoffe, diese Hilfe:)
Die Methode equalTo
benötigt Box<T>
, nicht Box<?>
. Wenn Sie ein Objekt vom Typ Box<?>
haben, können Sie Box<String>
oder gar Box<?>
nicht als Parameter für equalTo
verwenden, da die T
-Typen der beiden Felder möglicherweise nicht identisch sind.
Denken Sie daran, dass der Compiler zum Zeitpunkt der Kompilierung den statischen Typ des Objekts verwendet.
Dies wird also fehlschlagen:
%Vor%Aber das wird nicht:
%Vor%Box<?>
ist "eine Kiste mit unbekanntem". Box<? extends String>
wäre "eine Schachtel mit Dingen, die mindestens Strings sind" Box<String>
ist definitiv "eine Box mit Strings". null
in "Box of unknown" setzen? sicher. Gegeben,
%Vor% Er verlangt, dass der Compiler <String>
vergisst und dass box
"eine Box mit unbekanntem" ist. Die angezeigten Fehler weisen darauf hin, dass der Compiler die Überprüfung der Argumente nicht mehr durchführen kann. Es kann nicht überprüft werden, ob der angegebene Typ zum Unbekannten gehört oder nicht (außer für Null).
Kann nicht herausfinden, warum unten zwei aufgerufene Methode fehlschlägt
Sie schlagen fehl, weil die Wildcard so funktioniert.
Der Platzhalter steht für "einen Typ, den wir nicht mehr kennen".
Machen wir eine einfachere Klasse.
%Vor% Wenn wir Holder<?>
haben, haben wir spezielle Regeln, wie wir darauf zugreifen können. Insbesondere können wir Methoden mit einem generischen Argument nicht aufrufen. Das liegt daran, dass wir nicht wissen, um welchen Typ es sich handelt. Das wäre nicht sicher.
Wenn wir ein Holder<?>
haben, haben wir etwas (konzeptionell):
Wo X
bedeutet, dass der Typ für uns tabu ist, weil wir nicht mehr wissen, was es ist.
get
gibt Object
zurück, da dies die einzige Klasse ist, die sicher sein kann, dass obj
set
kann überhaupt nicht aufgerufen werden Ich denke, das mag seltsam erscheinen, wenn Ihr equalTo
ursprünglich wie
Dann könntest du es nennen. Der Platzhalter funktioniert jedoch nicht, indem einfach T
durch ?
ersetzt wird.