Ich weiß, dass wir instanceof List<E>
nicht aufrufen können, weil List<E>
kein umformbarer Typ ist. Sowohl instanceof List
als auch instanceof List<?>
arbeiten; Allerdings schlägt die Eclipse-IDE vor, instanceof List<?>
zu verwenden.
Ich frage mich, warum es ungebundene Wildcard instanceof List<?>
anstelle von roher Aufruf instanceof List
vorschlägt. Hat der ungebundene Platzhalter instanceof List<?>
einen Vorteil gegenüber dem rohen Aufruf instanceof List
?
Vielen Dank im Voraus.
Edit 1 : instanceof List
und instanceof List<?>
sind identisch mit dem Compiler, der den Typ beim Kompilieren löscht. Aber neben dem kosmetischen Grund, wie Mena darauf hinweist, hat es einen anderen Grund, instanceof List<?>
zugunsten von instanceof List
zu benutzen?
2 bearbeiten : Nach diesem Eintrag von Oracle:
- Der Typ eines instanceof / cast-Ausdrucks ist roh
Dies passiert sehr häufig, da javac instanceof Ausdrücke verbietet wessen Zieltyp ein generischer Typ ist; Für Umwandlungen ist der Compiler etwas permissiver, da Abgüsse zum generischen Typ erlaubt sind, aber a Warnung wird ausgegeben (siehe oben). Wie auch immer, der rohe Typ sollte ersetzt werden durch eine unbegrenzte Wildcard, da sie ähnliche Eigenschaften w.r.t. Subtyping.
Object o = new ArrayList<String>();
%Code%List<?> list_string = (List)o;
Somit können wir folgern, dass neben dem kosmetischen Grund, wie Mena sagte, und der Beschränkung, Genetik zu verwenden, //same as (List<?>)o boolean b = o instanceof List; //same as o instanceof List<?>
und instanceof List
gleich sind.
" List<E>
ist kein verifizierbarer Typ" ist nicht der beste Weg zu formulieren, warum instanceof
nicht kompiliert wird.
Der Operator instanceof
überprüft den Typ Ihres Objekts zur Laufzeit.
Daher verhindert type-Löschung , dass Java seinen parametrisierten Typ (den Typ) nicht kennt zwischen dem <>
).
Ein roher List
(entspricht einem List<Object>
) oder ein List<?>
(dh ein List
eines unbekannten Typs) bedeutet also hier praktisch dasselbe, obwohl normalerweise von der rohen Syntax abgeraten wird (hier für kosmetische Gründe).
Liste ist selbst ein Typ. Es wird also keinen Unterschied geben, wenn Sie den Typ darin ändern.
Vielleicht weil List
ein unformatierter Typ ist und List<?>
nicht. Rohtypen sind möglicherweise sehr gefährlich, weil sie viele seltsame Nebenwirkungen haben können.
Ich werde eine Referenz veröffentlichen, sobald ich sie finden kann.
Tags und Links java generics erasure collections type-erasure