web-dev-qa-db-fra.com

Comment initialiser un objet List <String> en Java?

Je ne peux pas initialiser une liste comme dans le code suivant:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

Je fais face à l'erreur suivante:

Impossible d'instancier le type List<String>

Comment puis-je instancier List<String>?

366
ahmednabil88

Si vous vérifiez le API pour List, vous remarquerez qu'il est écrit:

Interface List<E>

Être un interface signifie qu'il ne peut pas être instancié (aucune new List() n'est possible).

Si vous vérifiez ce lien, vous trouverez quelques classes qui implémentent List:

Toutes les classes d'implémentation connues:

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

Ceux-ci peuvent être instanciés. Utilisez leurs liens pour en savoir plus sur eux, I.E: pour savoir lequel correspond le mieux à vos besoins.

Les 3 les plus couramment utilisés sont probablement:

 List<String> supplierNames1 = new ArrayList<String>();
 List<String> supplierNames2 = new LinkedList<String>();
 List<String> supplierNames3 = new Vector<String>();

Prime:
Vous pouvez également l'instancier avec des valeurs, de manière plus simple, à l'aide de la variable Arraysclass, comme suit:

List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

Mais notez que vous n'êtes pas autorisé à ajouter d'autres éléments à cette liste, car il s'agit de fixed-size.

687
J.A.I.L.

Impossible d'instancier une interface, mais il y a peu d'implémentations:

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

De plus, il existe de nombreux autres moyens fournis par d’autres bibliothèques comme Guava.

List<String> list = Lists.newArrayList("one", "two", "three");
90
LazerBanana

La liste est un Interface, vous ne pouvez pas instancier une interface, car interface est une convention, quelles méthodes doivent avoir vos classes. Pour instancier, vous avez besoin de quelques réalisations (implémentations) de cette interface. Essayez le code ci-dessous avec les implémentations très populaires de l'interface List:

List<String> supplierNames = new ArrayList<String>(); 

ou

List<String> supplierNames = new LinkedList<String>();
36
Doseke

Vous devrez utiliser ArrayList<String> ou autre.

List<String> est une interface.

Utilisez ceci:

import Java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();
13
Ofir Farchy

La liste est une interface et vous ne pouvez pas initialiser une interface. Instanciez une classe d'implémentation à la place.

Comme:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();
11
Ankit

Dans la plupart des cas, vous voulez un simple ArrayList - une implémentation de List

Avant la version 7 du JDK

List<String> list = new ArrayList<String>();

JDK 7 et plus tard, vous pouvez utiliser l'opérateur diamant

List<String> list = new ArrayList<>();

Des informations complémentaires sont écrites ici documentation Oracle - Collections

9
Daniel Perník

La liste n'est qu'une interface, une définition d'une liste générique. Vous devez fournir une implémentation de cette interface de liste. Les deux plus courants sont:

ArrayList - une liste implémentée sur un tableau

List<String> supplierNames = new ArrayList<String>();

LinkedList - une liste implémentée comme une chaîne d'éléments interconnectés

List<String> supplierNames = new LinkedList<String>();
8
Jakub Zaverka

Si vous voulez juste créer un immuable List<T> avec seulement un objet, vous pouvez utiliser cette API:

List<String> oneObjectList = Collections.singletonList("theOnlyObject”);

Plus d'infos: docs

6
Sakiboy

En fonction du type de liste que vous souhaitez utiliser, quelque chose comme

List<String> supplierNames = new ArrayList<String>();

devrait vous y aller.

List est l'interface, ArrayList est une implémentation de l'interface List. Vous trouverez plus d'implémentations pouvant mieux répondre à vos besoins en lisant le JavaDocs de l'interface List .

6
Uli

La liste est une interface. Vous ne pouvez pas utiliser List pour l'initialiser.

  List<String> supplierNames = new ArrayList<String>();

Ce sont quelques unes des classes impelementées de List,

ArrayList, LinkedList, Vector

Vous pouvez utiliser tout cela selon vos besoins. Ces classes ont chacune leurs propres caractéristiques.

5
Suranga

Juste au cas où, quiconque resterait encore sur cette question. Parce que, je vois un ou deux nouveaux utilisateurs qui posent à nouveau la même question et tout le monde qui le dit, Non, vous ne pouvez pas le faire, chère Prudence , à part Toutes les réponses données ici, je voudrais fournir des informations supplémentaires - Oui, vous pouvez réellement le faire, Liste liste = new List (); Mais au prix de l’écriture des implémentations de toutes les méthodes d’Interfaces. La notion n'est pas simplement List list = new List (); mais

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;
        }

..... et ainsi de suite (Je ne peux pas écrire toutes les méthodes.)

Ceci est un exemple de classe anonyme. C'est correct quand quelqu'un dit, Non, vous ne pouvez pas instancier une interface, et c'est vrai. Mais vous ne pouvez jamais dire, Vous pouvez écrire Liste de liste = nouvelle Liste (); mais, évidemment, vous pouvez le faire et c'est une déclaration difficile à faire que vous pouvez ne fais pas .

3
yashpandey

Nous avons créé soyuz-to pour simplifier un problème: comment convertir X en Y (par exemple, String en Integer). Construire un objet est aussi une sorte de conversion, il a donc une fonction simple: Map, List, Set:

import io.thedocs.soyuz.to;

List<String> names = to.list("John", "Fedor");

S'il vous plaît vérifier - il a beaucoup d'autres fonctionnalités utiles

0
fedor.belov