Der Unterschied zwischen instanceof List und instanceof List? [Duplikat]

8

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:

  
  1. Der Typ eines instanceof / cast-Ausdrucks ist roh
  2.   

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.

    
Linh 05.08.2015, 08:51
quelle

3 Antworten

3

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

    
Mena 05.08.2015, 09:00
quelle
0

Liste ist selbst ein Typ. Es wird also keinen Unterschied geben, wenn Sie den Typ darin ändern.

    
Burak Yıldırım 05.08.2015 08:59
quelle
0

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.

    
OldCurmudgeon 05.08.2015 08:57
quelle