Ich kann eine Liste nicht wie im folgenden Code initialisieren:
List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));
Ich stelle den folgenden Fehler gegenüber:
Der Typ
List<String>
kann nicht instanziiert werden
Wie kann ich List<String>
instanziieren?
Wenn Sie das API auf List
prüfen, werden Sie feststellen, dass darin steht:
Interface List<E>
Ein interface
zu sein bedeutet, dass es nicht instanziiert werden kann (es ist keine new List()
möglich).
Wenn Sie diesen Link überprüfen, finden Sie einige class
es, die List
implementieren:
Alle bekannten implementierenden Klassen:
AbstractList
,AbstractSequentialList
,ArrayList
,AttributeList
,CopyOnWriteArrayList
,LinkedList
,RoleList
,RoleUnresolvedList
,Stack
,Vector
Diese können instanziiert werden. Verwenden Sie ihre Links, um mehr über sie zu erfahren.
Die 3 am häufigsten verwendeten sind wahrscheinlich:
List<String> supplierNames1 = new ArrayList<String>();
List<String> supplierNames2 = new LinkedList<String>();
List<String> supplierNames3 = new Vector<String>();
Bonus:
Sie können es auch auf einfachere Weise mit Werten instanziieren, indem Sie Arrays
class
wie folgt verwenden:
List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));
Beachten Sie jedoch, dass Sie dieser Liste keine weiteren Elemente hinzufügen dürfen, da es sich um fixed-size
Handelt.
Eine Schnittstelle kann nicht instanziiert werden, es gibt jedoch einige Implementierungen:
JDK2
List<String> list = Arrays.asList("one", "two", "three");
JDK7
//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
JDK8
List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());
JDK9
// creates immutable lists, so you can't modify such list
List<String> immutableList = List.of("one", "two", "three");
// if we want mutable list we can copy content of immutable list
// to mutable one for instance via copy-constructor (which creates shallow copy)
List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));
Außerdem gibt es viele andere Möglichkeiten, die von anderen Bibliotheken bereitgestellt werden, z. B. Guava.
List<String> list = Lists.newArrayList("one", "two", "three");
Liste ist ein Interface, Sie können kein Interface instanziieren, da Interface eine Konvention ist, welche Methoden Ihre Klassen haben sollen. Zum Instanziieren benötigen Sie einige Realisierungen (Implementierungen) dieser Schnittstelle. Probieren Sie den folgenden Code mit sehr beliebten Implementierungen der List-Schnittstelle aus:
List<String> supplierNames = new ArrayList<String>();
oder
List<String> supplierNames = new LinkedList<String>();
Sie müssen ArrayList<String>
oder ein solches verwenden.
List<String>
ist eine Schnittstelle.
Benutze das:
import Java.util.ArrayList;
...
List<String> supplierNames = new ArrayList<String>();
Liste ist eine Schnittstelle, und Sie können eine Schnittstelle nicht initialisieren. Instanziieren Sie stattdessen eine implementierende Klasse.
Mögen:
List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();
In den meisten Fällen möchten Sie einfach ArrayList
- eine Implementierung von List
Vor JDK Version 7
List<String> list = new ArrayList<String>();
Ab JDK 7 können Sie den Diamantoperator verwenden
List<String> list = new ArrayList<>();
Weitere Informationen finden Sie hier Oracle Dokumentation - Sammlungen
Liste ist nur eine Schnittstelle, eine Definition einer generischen Liste. Sie müssen eine Implementierung dieser Listenschnittstelle bereitstellen. Zwei am häufigsten sind:
ArrayList - Eine Liste, die über ein Array implementiert ist
List<String> supplierNames = new ArrayList<String>();
LinkedList - Eine Liste, die wie eine zusammenhängende Kette von Elementen implementiert ist
List<String> supplierNames = new LinkedList<String>();
Wenn Sie nur ein unveränderliches List<T>
mit nur einem Objekt erstellen möchten, können Sie diese API verwenden:
List<String> oneObjectList = Collections.singletonList("theOnlyObject”);
Weitere Informationen: docs
Abhängig davon, welche Art von Liste Sie verwenden möchten
List<String> supplierNames = new ArrayList<String>();
sollte dich zum Laufen bringen.
List ist die Schnittstelle, ArrayList ist eine Implementierung der List-Schnittstelle. Weitere Implementierungen, die möglicherweise besser zu Ihren Anforderungen passen, finden Sie in den JavaDocs der List-Schnittstelle .
Liste ist eine Schnittstelle. Sie können List nicht verwenden, um es zu initialisieren.
List<String> supplierNames = new ArrayList<String>();
Dies sind einige von List impelemented Klassen,
ArrayList, LinkedList, Vector
Sie können jedes dieser Elemente gemäß Ihren Anforderungen verwenden. Diese Klassen haben jeweils ihre eigenen Funktionen.
Nur für den Fall, dass sich noch jemand mit dieser Frage beschäftigt. Weil ich sehe, dass ein oder zwei neue Benutzer wieder die gleiche Frage stellen und jeder dann sagt, Nein, das kannst du nicht, liebe Klugheit , abgesehen von Zu allen hier gegebenen Antworten möchte ich zusätzliche Informationen geben. - Ja, das können Sie tatsächlich tun. List list = new List (); Aber auf Kosten des Schreibens von Implementierungen aller Methoden von Interfaces. Der Begriff ist nicht einfach List list = new List (); aber
List<Integer> list = new List<Integer>(){
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean contains(Object o) {
// TODO Auto-generated method stub
return false;
}
..... und so weiter (Kann nicht alle Methoden schreiben.)
Dies ist ein Beispiel für anonyme Klasse. Es ist richtig, wenn jemand angibt, Nein, Sie können keine Schnittstelle instanziieren und das ist richtig. Aber Sie können niemals sagen, Sie KÖNNEN NICHT schreiben List list = new List (); aber offensichtlich können Sie das tun und das ist eine harte Aussage , die Sie machen können nicht tun .
Wir haben soyuz-to erstellt, um 1 Problem zu vereinfachen: wie X
in Y
konvertiert wird (z. B. String
in Integer
). Das Konstruieren eines Objekts ist auch eine Art Konvertierung, sodass es eine einfache Funktion zum Konstruieren von Map
, List
, Set
hat:
import io.thedocs.soyuz.to;
List<String> names = to.list("John", "Fedor");
Bitte überprüfen Sie es - es hat viele andere nützliche Funktionen