Warum kann ich den Platzhalter (?) nicht als Parametertyp, Feld, lokale Variable oder als Rückgabetyp einer Methode verwenden?

9

Das Oracle-Dokument über Wildcards in Generics lautet:

  

Der Platzhalter kann in verschiedenen Situationen verwendet werden: als Typ von a   Parameter , Feld oder lokale Variable ; manchmal als return type   (Obwohl es eine bessere Programmierpraxis ist, genauer zu sein).

Ich habe alle vier in der folgenden Klasse ausprobiert und habe Compiler-Fehler auf jedem einzelnen bekommen. Warum? Was mache ich falsch?

%Vor%     
Solace 23.06.2016, 17:51
quelle

4 Antworten

5

Das Tutorial ist schrecklich formuliert. Sie können keinen Platzhalter für eines der aufgeführten Dinge verwenden. Sie können einen generischen Typ mit einem Platzhalter dafür verwenden .

%Vor%     
user2357112 23.06.2016, 20:49
quelle
8

Das ? -Zeichen ist der Platzhaltertyp Argument .

Der Artikel beginnt mit

  

Im generischen Code wird das Fragezeichen (?), der Platzhalter,   repräsentiert einen unbekannten Typ.

Der einzige Ort, wo Sie diese Syntax verwenden können, ist als Teil des generischen Codes, dh. ein generisches Argument. Der nächste Satz bezieht sich auf generischen Code, der den Platzhalter verwendet. Also zum Beispiel

  

als Typ eines Parameters

Sie könnten

haben %Vor%

Oder für

  

als lokale Variable

%Vor%

Aber

  

Der Platzhalter wird niemals als Typargument für eine generische Methode verwendet   Aufruf, eine generische Klasseninstanzerstellung oder ein Supertyp.

Sie können es nicht als

verwenden %Vor%     
Sotirios Delimanolis 23.06.2016 18:00
quelle
2

Platzhalter kann mit & lt; & gt; Operator in einem Generika-Konzept eingeführt in Java 5, zur Darstellung eines unbekannten Typs . Generics wird verwendet, um eine Klasse mit einem Member im verallgemeinerten Format zu definieren. Wenn Sie beim Erstellen des Objekts angeben möchten, dass der Benutzer den Typ des Elements angibt, können Sie das Konzept der Generika verwenden. Es kann nur für das Instanzmitglied verwendet werden, das nicht mit dem statischen Element verwendet werden kann, da Speicher für statische nur einmal zugewiesen wird.

Wildcard-Konzept in Generics eingeführt, um unbekannte Art zu beschränken, sagen wir, ich habe eine Liste, die Wildcard hat und dieses Platzhalter Nummer Wrapperklasse erweitern. Das bedeutet, dass list mit Integer, Long, Short, Byte arbeiten kann, weil sie die Number-Wrapper-Klasse erweitern, aber nicht mit String, da die String-Klasse die Number-Wrapper-Klasse nicht erweitert.

%Vor%

Komm zu dir Programm, du hast eine falsche Syntax benutzt, da ich Wildcard erwähnt habe, kann mit & lt; & gt; Betreiber.

  

Wir können keinen Platzhalter verwenden, während die Klasse wie oben erwähnt -

instanziiert wird
%Vor%

, aber wir können Generika verwenden, um das Feld als unbekannten Typ wie I, N, S in der Mitarbeiterklasse bereitzustellen. Dieser Typ wird beim Erstellen des Klassenobjekts angegeben -

%Vor%
  

Platzhalter als Methodenparameter -

%Vor%
  

Lokale Variable als Platzhalter deklarieren -

%Vor%
  

Wir können Wildcard und Generics als Rückgabetyp der Methode verwenden.   Hier ist das Beispiel von Generics als Rückgabetyp der Methode -

%Vor%

Hier ist das Beispiel von Wildcard als Rückgabetyp der Methode -

%Vor%     
RCS 23.06.2016 19:59
quelle
1

Wildcards haben keine individuelle Existenz. Sie werden immer als Typparameter für generische Klassen verwendet. Beispiel: List<? extends Number> . Ich gebe ein Beispiel für alle Szenarien.

%Vor%     
Breaking Benjamin 23.03.2017 06:42
quelle