Comment initialiser un objet List <String> en Java?

405

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>?

ahmednabil88
la source

Réponses:

734

Si vous cochez l' API pour Listvous remarquerez qu'il dit:

Interface List<E>

Être un interfacemoyen ne peut pas être instancié (non, new List()c'est possible).

Si vous cochez 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 à leur sujet, IE: pour savoir ce qui correspond le mieux à vos besoins.

Les 3 plus couramment utilisés sont probablement:

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

Bonus:
Vous pouvez également l'instancier avec des valeurs, d'une manière plus simple, en utilisant le Arrays class, 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 plus d'éléments à cette liste, tel quel fixed-size.

PRISON
la source
1
Arrays.asList est génial, mais comme vous auriez dû le remarquer, il ne parvient pas à faire ce que l'on attend dans des cas commeint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D
1
@JAIL Ce n'est pas ce qui se passe. C'est une liste d'un élément, où l'un est un tableau d'entiers. Le comportement recherché était probablement une liste de trois éléments 1, 2 et 3.
Christoffer Hammarström
1
@Christoffer Hammarström pour imprimer une liste ou un tableau, vous pouvez utiliser java.util.Arrays.toString (array) ;, donc cette fonctionnalité est déjà fournie ..
Maxr1998
1
Une utilisation de stockage de Vector comme celle - ci et ici . En raison de problèmes de threading
Nuno Rafael Figueiredo
3
Si vous avez besoin que la liste résultante soit un ArrayList, utiliseznew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F
115

Impossible d'instancier une interface mais il existe 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 nombreuses autres façons fournies par d'autres bibliothèques comme Guava .

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

La liste est une interface , vous ne pouvez pas instancier une interface, car l'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>();
Doseke
la source
14

Vous devrez utiliser ArrayList<String>ou autre.

List<String> est une interface.

Utilisez ceci:

import java.util.ArrayList;

...

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

La liste est une interface et vous ne pouvez pas initialiser une interface. Instanciez plutôt une classe d'implémentation.

Comme:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();
Ankit
la source
9

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>();
Jakub Zaverka
la source
9

Dans la plupart des cas, vous voulez simple ArrayList- une implémentation deList

Avant JDK version 7

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

JDK 7 et versions ultérieures, vous pouvez utiliser l'opérateur diamant

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

De plus amples informations sont écrites ici Documentation Oracle - Collections

Daniel Perník
la source
7

Selon le type de liste que vous souhaitez utiliser, quelque chose comme

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

devrait vous permettre de continuer.

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

Uli
la source
7

Si vous souhaitez simplement créer un immuable List<T> avec un seul objet, vous pouvez utiliser cette API:

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

Plus d'informations: docs

Sakiboy
la source
5

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 List,

ArrayList, LinkedList, Vector

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

Quelqu'un
la source
Une utilisation de stockage de Vector comme celle - ci et ici . En raison de problèmes de threading
Nuno Rafael Figueiredo
3

Au cas où, quelqu'un s'attarderait toujours sur cette question. Parce que, je vois un ou deux nouveaux utilisateurs poser à nouveau la même question et tout le monde dit alors, non, vous ne pouvez pas le faire, chère prudence , en dehors de toutes les réponses données ici, je voudrais fournir des informations supplémentaires - oui, vous pouvez réellement do, List list = new List (); Mais au prix d'écrire des implémentations de toutes les méthodes des 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 (Impossible d'écrire toutes les méthodes.)

Ceci est un exemple de classe Anonymous . C'est correct quand quelqu'un déclare, non, vous ne pouvez pas instancier une interface, et c'est vrai. Mais vous ne pouvez jamais dire, vous CANT écrivez List list = new List (); mais, évidemment, vous pouvez le faire et c'est une déclaration difficile à faire que vous ne pouvez pas faire .

kenobiwan
la source
Pour être clair cependant, cela ne crée pas un objet dont le type réel est List. Au lieu de cela, il déclare une nouvelle classe qui n'a pas de nom et n'implémente pas List, et au moment de l'exécution crée un nouvel objet de la classe nouvellement déclarée.
Radiodef
0

Nous avons créé soyuz-to pour simplifier 1 problème: comment convertir Xen Y(par exempleString en Integer). La construction d'un objet est aussi sorte de conversion de sorte qu'il a une fonction simple à construire Map, List, Set:

import io.thedocs.soyuz.to;

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

Veuillez le vérifier - il a beaucoup d'autres fonctionnalités utiles

fedor.belov
la source