E
ist eine Variable vom Typ - es steht für eine andere Art in, wie String
oder Integer
. So wie Sie dst.add(pop())
nicht verstehen können, ohne zu wissen, wo und wie dst
definiert wurde, können Sie eine Methodendeklaration wie popAll(Collection<E> dst)
nicht verstehen, ohne zu wissen, wo und wie die Typvariable E
definiert ist. Bei popAll
ist die Typvariable E
auf der Klassenebene definiert: Stack<E>
: Es ist der Typ der Elemente im Stapel. Sie werden oft sogar sehen es javadoc'd:
/**A Stack of elements
*
*@param E The type of elements in the stack */
public class Stack<E>{
public void popAll(Collection<E> dst){ ... }
}
Auf der anderen Seite, wenn Sie eine Methode Erklärung wie public <E> void ...
sehen, die Art Variable E
wird erklärt (nicht von einem umschließenden Umfang verwiesen wie die umschließende Klasse). In den meisten Fällen, wenn Sie eine Methode mit einer eigenen Typvariablen sehen, handelt es sich um eine statische Methode. Daher gibt es keine umschließende Instanz der Klasse, um den Wert E
festzulegen.
In beiden Fällen, was macht die E
Variable? Es sagt uns, wie zwei verschiedene Typen miteinander in Beziehung stehen müssen. In popAll
teilt es uns mit, dass der Elementtyp der Sammlung, in die die popped-Elemente eingefügt werden sollen, dem Elementtyp des Stapels entsprechen muss, aus dem Sie die Popup-Elemente auswählen.
In ähnlicher Weise nehmen Sie das Beispiel von Seite 136:
public class ListUtils{
public static <E> E reduce(List<E> list, Function<E> f, E initVal);
}
Hier ist die E
Variable vom Typ sagt uns, dass der Elementtyp von list
hat das Argument Art von f
und die Art der initVal
anzupassen. Die umgebende Klasse definiert E
für uns nicht, sie ist nur im Rahmen der Methodenklaration reduce
sinnvoll.
Ich bin mir nicht sicher, warum dies als ein Duplikat gekennzeichnet wurde. Der angebliche Betrogene ist eine ganz andere Frage. –
Da ich keine legitime Antwort posten kann, werde ich mit einem Kommentar antworten: Ich glaube der Unterschied ist, dass im ersten Fall die ganze Klasse als generisch deklariert wird, während im zweiten Fall nur die Methode generisch ist. –
Gewählt, um wieder zu öffnen. Ich konnte es aus der anderen Frage nicht herausfinden. Die scheinen verwandt zu sein, aber nicht doppelt. –