2014-03-12 14 views
6

Ich habe Schwierigkeiten, Wildcards in Java-Generika zu verstehen. Ich habe speziell die folgenden Fragen:Schwierigkeit Wildcards in Java verstehen

  1. Wenn wir eine LinkedList<?> haben, warum können wir eine Object es nicht hinzufügen? Ich verstehe, dass es den Typ der Liste nicht kennt, aber würde kein Object zur Liste hinzufügen, haben wir in jeder Situation abgedeckt?

  2. Ähnlich wie die Frage oben, wenn wir LinkedList<? extends Number> haben, warum können wir nicht add ein Number zu ihm?

  3. Schließlich, wenn wir LinkedList<? super Number> haben, warum können wir add eine Integer auf der Liste, sollten wir nicht in der Lage, nur die Dinge hinzufügen, die eine übergeordnete Klasse der Nummer sind?

Ich denke, ich versuche zu verstehen, wie Platzhalter in der Regel arbeiten, ich habe die Oracle-Tutorials auf sie zu lesen, und ein paar andere Dinge, aber ich verstehe nicht, warum sie arbeiten nehme ich an.

+0

Liste bedeutet, dass die Liste alles enthalten kann, aber alle diese Anythings vom selben Typ sind. Da Sie nicht wissen, was sie sind, können Sie keinen hinzufügen. – deanosaur

+0

Aus irgendeinem Grund habe ich über UNIX-Shell-Wildcards nachgedacht. – hcaulfield57

Antwort

5

Sie verwirren Objekte und Typen.
Im Gegensatz zu einfachen generischen Parametern beschreiben Platzhalter den Typ des generischen Parameters.
Eine List<? super Number> ist keine Liste von Superklassen von Number; es ist eine Liste mit einem unbekannten Typ, wobei dieser Typ eine Oberklasse der Nummer ist.

Ein LinkedList<?> könnte ein LinkedList<Car> sein.
Da eine Object keine Car ist, können Sie keine Object hinzufügen.

In der Tat, da Sie nicht wissen, irgendetwas über welchen Typ die Liste enthält, können Sie nichts hinzufügen. (Außer null)

Ebenso ein LinkedList<? extends Number> könnte ein List<Long> sein, so können Sie einen Integer es nicht hinzuzufügen. (Da ein Integer kein Long ist)

Auf der anderen Seite, ein List<? super Number> ist auf jeden Fall erlaubt enthalten Number oder jede Klasse abgeleitet, da es nur eine Liste von einem der Number ‚s Super sein kann (zB List<Object>)

+0

Danke für die Antwort, das macht mehr Sinn für mich, aber ich versuche immer noch zu verstehen, warum Sie Subklassen von 'Number' zu einer' List ', wenn wir etwas zu einer' List 'behandelt es es als ein' Objekt'? – hcaulfield57

+0

Es behandelt es nicht als irgendetwas. Ganz gleich, welche Superklasse von 'Number' die Liste eigentlich ist, kann sie durchaus eine' Number' enthalten. – SLaks

+0

Okay, aber wenn du '' Integer' '' '' 'hinzufügst? Super Number> ', das ist keine Superklasse von' Number', also wie kannst du es hinzufügen, oder fehlt mir etwas? – hcaulfield57