Java Generics Wildcard Verwirrung [duplizieren]

7

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

    
foolhunger 02.01.2015, 03:07
quelle

4 Antworten

7
%Vor%
  1. In OOP verwenden Sie Polymorphismus . Daher ist der Typ des Boxobjekts zur Kompilierungszeit Box<?>

  2. 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:)

    
hqt 02.01.2015, 03:26
quelle
5

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%     
Jeff Storey 02.01.2015 03:19
quelle
4
  • 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".
  • Also, wenn wir eine "Box of unknown" haben, und wir versuchen, einen Typ (sagen wir einen String) darin zu setzen. Compiler ist nicht sicher. Es ist eine Kiste mit unbekannten. Was, wenn es nur ganze Zahlen akzeptiert?
  • Können wir null in "Box of unknown" setzen? sicher.
  • Was bekommen wir () von einer "Box of Unknown"? mindestens ein Objekt.

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).

    
S.D. 02.01.2015 05:15
quelle
3
  

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):

%Vor%

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
  • ist
  • set kann überhaupt nicht aufgerufen werden

Ich denke, das mag seltsam erscheinen, wenn Ihr equalTo ursprünglich wie

deklariert wurde %Vor%

Dann könntest du es nennen. Der Platzhalter funktioniert jedoch nicht, indem einfach T durch ? ersetzt wird.

    
Radiodef 02.01.2015 03:27
quelle

Tags und Links