Ich habe gerade über generische Programmierung, die List<E>
Schnittstelle und studiert ArrayList
, damit ich die folgende Aussage verstehen kann.
ArrayList<String> list = new ArrayList<String>();
Aber ich verstehe die nächste Aussage, die ich beim Surfen im Internet gesehen habe, nicht.
List<String> list2 = Collections.<String>emptyList();
- Was ist
Collections
? Warum ist es nichtCollections<E>
oderCollections<String>
? - Warum steht
<String>
vor dem MethodennamenemptyList
?
(Ist nicht emptyList<String>()
korrekt für Generic?)
- Was bedeutet die Aussage?
java
generics
collections
Jenix
quelle
quelle
Collections
ist eine Java-Klasse.Antworten:
Diese Zeile erstellt eine leere Liste von Zeichenfolgen, indem eine statische Methode mit einem generischen Typparameter aufgerufen wird.
Innerhalb der
Collections
Klasse gibt es eine statische MethodeemptyList
, die wie folgt deklariert ist:public static final <T> List<T> emptyList() { return (List<T>) EMPTY_LIST; }
Dies hat einen generischen Typparameter
T
. Wir nennen call this method mit:und
T
wirdString
aufgrund der Art von als gefolgertlist
.Wir können den Typ auch angeben,
T
indem wir ihn beim Aufruf in spitze Klammern setzenemptyList
. Dies kann erforderlich sein, wenn wir einen spezifischeren Typ wünschen, als abgeleitet wird:emptyList<String>()
ist nicht korrekt, da diese Platzierung nur gültig ist, wenn Instanzen generischer Klassen erstellt werden und keine Methoden aufgerufen werden. Bei Verwendungnew
gibt es zwei mögliche Typparameter, die vor dem Klassennamen nur für den Konstruktor und die nach dem Klassennamen für die gesamte Instanz, also für die Klasse:class MyClass<A> { public <B> MyClass(A a, B b) { System.out.println(a + ", " + b); } }
Wir können seinen Konstruktor nennen, wo
A
istString
undB
istInteger
wie:MyClass<String> a = new <Integer>MyClass<String>("a", 3);
oder durch Verwendung der Typinferenz:
MyClass<String> a = new MyClass<>("a", 3);
Siehe auch:
quelle
Collections
es sich bei einer dieser Klassen nur um statische Methoden handelt. Es ist nicht dazu gedacht, selbst instanziiert zu werden (und kann es auch nicht sein).foo<T>()
ist nicht überhaupt „einen Konstruktor aufrufen“, obwohl die resultierende Objekt Konstruktion führt zu einem Aufruf vonfoo
‚s - Konstruktor (unter alle anderen Schritte a zu instanziiert genommenfoo
) . Dann gibt es keine tatsächliche Inkonsistenz oder Diskrepanz mit der generischen Methodenaufrufsyntax<T>bar()
(die aus einem C ++ - Hintergrund stammt und sehr seltsam ist, lassen Sie mich einfach sagen!).new <String>MyClass<Integer>(2)
.SomeClass<String>()
dient zum Erstellen einer Instanz einer generischen Klasse mit einem nicht generischen Konstruktor. Um eine Instanz einer Klasse mit einem generischen Konstruktor zu erstellen, würden Sie so etwas tunnew <String> SomeClass()
.Collections
ist eine JDK-Klasse.Es ist nicht generisch und kann nicht instanziiert werden.
Collections#emptyList
ist eine generische Methode. Hier geben wir explizit ein Typargument anString
.Nein, in Java stehen generische Typargumente für Methoden vor dem Methodennamen.
Wir rufen die statische
emptyList
Methode auf und weisen ihren Rückgabewert einer Variablen vom Typ zuList<String>
.quelle
Kurz gesagt, dies erstellt eine leere, unveränderliche Liste von Zeichenfolgen.
Schauen wir uns den Ausdruck Stück für Stück an.
Collections
ist der Name einer Klasse. Aus dem Javadoc :emptyList()
ist der Name einer statischen Methode, die in derCollections
Klasse ( Javadoc ) definiert ist. Es ist eine generische Methode, und das<String>
inCollections.<String>emptyList()
gibt das generische Typargument an.Die Methode gibt a zurück
List<T>
, in diesem FallList<String>
: eine Liste von Zeichenfolgen. Insbesondere wird eine leere , unveränderliche Liste von Zeichenfolgen zurückgegeben.quelle
+1
zum Hervorheben (obwohl in den Dokumenten vorhanden) der Unveränderlichkeit der zurückgegebenen Sammlung.1.Sammlung ist eine Schnittstelle und Sammlungen sind eine statische Klasse, die ausschließlich aus statischen Methoden besteht, die Sammlungen bearbeiten oder zurückgeben. Daher können wir nicht verwenden
Collections<E>
oderCollections<String>
.2.
<String>
before emptyList (wird verwendet, um die leere Liste abzurufen, die unveränderlich ist) gibt an, dass nur String-Werte hinzugefügt werden können. Mögen:list2.add("A"); list2.add("B");
3.Die Anweisung bedeutet, dass eine unveränderliche leere Liste vom Typ Liste erstellt wird.
Sie können diesen Link überprüfen: Unterschied zwischen Java Collection und Collections
quelle
denotes that only String values can be added to it.
Eine genauere Beschreibung lautet: Sie deklariert den Parametertyp der Methode als String, sodass der Rückgabewert eine homogene Liste von Strings ist.Erstens
Collections
handelt es sich um eine Hilfsbibliothek statischer Methoden, die mit verschiedenen Arten von Sammlungen arbeiten. Wenn Sie irgendeine Art von C ++ - Programmierung durchgeführt haben, ist dies ein Synonym für die<algorithm>
Funktionsbibliothek.In diesem Fall rufen Sie die statische Methode auf
emptyList()
, die eine leere Liste eines bestimmten Typs zurückgibt. Da für diese Methoden immer noch ein Typ erforderlich ist,Collections
die Methoden jedoch auf viele Typen verweisen können, müssen Sie den Typ beim Aufruf angeben.Um eine generische Methode aufzurufen , müssen Sie sie mit der Parameterliste (dh
<String>
) vor dem Methodennamen, aber nach dem Punkt aufrufen .quelle