3 votes

Que signifie cette déclaration avec List et ArrayList ?

Je suis en train de lire les exemples de Drools Planner et je suis tombé sur du code comme celui-ci :

List<Column> columnList = new ArrayList<Column>(n);

D'après ce que j'ai compris, il est censé initialiser une liste de longueur n qui stocke les données suivantes Column type de données.


Mais quel est l'intérêt d'avoir différents types de données de collection de part et d'autre de l'expression ?

Si ArrayList<Column> les correspondances de type avec List<Column> En quoi cela diffère-t-il de ce que l'on fait ?

List<Column> columnList = new List<Column>(n);

7voto

hvgotcodes Points 55375

List est une interface. Il n'est pas possible de créer des instances d'interfaces.

ArrayList est une classe qui implémente List, vous pouvez en créer une.

Une interface ne fait que définir un comportement. Une classe qui met en œuvre une interface met en œuvre ce comportement.

Vous noterez que si vous regardez l'API de nombreuses classes différentes mettent en œuvre la fonction List l'interface. C'est parce qu'ils fournissent tous des implémentations pour les méthodes que les List définit. De plus, ces implémentations sont probablement très différentes, car et ArrayList fonctionne différemment d'un LinkedList .

Il est préférable d'utiliser la forme

List list = new ListType()

car vous pouvez modifier l'implémentation de la liste ultérieurement, si vous le souhaitez, sans affecter votre code. La raison en est que si vous faites

ListType list = new ListType()

le type de liste est ListType qui n'est qu'une instance de ListType et les sous-classes.

Si vous procédez à l'affectation préférentielle indiquée ci-dessus, vous pouvez alors affecter n'importe quoi qui met en œuvre List a list .

6voto

Reverend Gonzo Points 15504

List est une interface. ArrayList est une implémentation de List .

Vous ne pouvez pas faire new List<Column>(n) parce que List définit simplement les méthodes qui doivent être mises en œuvre.

L'idée d'avoir List = (some implementation) est qu'il est possible d'avoir un code agnostique à la mise en œuvre qui se comporte selon le contrat d'une interface. (Par exemple, vous pouvez remplacer ArrayList par LinkedList et cela fonctionnera, même si l'implémentation sera totalement différente et que les performances seront évidemment différentes).

6voto

Petar Minchev Points 24864

La liste est une interface et ne peut pas être instanciée. new List déclenchera une erreur de compilation. Vous pouvez faire ArrayList<Column> columnList = new ArrayList<Column>(n); mais de cette façon, vous ne pouvez pas passer facilement d'un modèle à l'autre. List les mises en œuvre( ArrayList est l'un d'entre eux).

1voto

ndriks Points 349

La liste est en fait une interface et ne peut donc pas être instanciée. Ainsi, pour utiliser la liste, vous devez créer un objet de son implémentation, par exemple : ArrayList. Lire http://docs.oracle.com/javase/1.4.2/docs/api/java/util/List.html pour plus d'informations

1voto

James B Points 1842

En marge des autres réponses, il convient de noter que List est le type à la compilation de columnList y ArrayList est le type d'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X