Dois-je déclarer/Initialiser ArrayLists que des Listes, des ArrayLists, ou ArrayLists de <Cat>
Quelle est la différence dans la déclaration d'une collection en tant que telle
public class CatHerder{
private List cats;
public CatHerder(){
this.cats = new ArrayList<Cat>();
}
}
//or
public class CatHerder{
private ArrayList cats;
public CatHerder(){
this.cats = new ArrayList();
}
}
//or
public class CatHerder{
private ArrayList<Cat> cats;
public CatHerder(){
this.cats = new ArrayList<Cat>();
}
}
OriginalL'auteur davidahines | 2011-03-30
Vous devez vous connecter pour publier un commentaire.
Vous devez le déclarer comme une
List<Cat>
, et l'initialiser comme unArrayList<Cat>
.List
est une interface, etArrayList
est une application de classe. Il est presque toujours préférable de code par rapport à l'interface et non pas la mise en œuvre. De cette façon, si vous avez besoin de changer la mise en œuvre plus tard, il ne cassera pas les consommateurs qui code par rapport à l'interface.Selon la façon dont vous l'utiliser effectivement la liste, vous pourriez même être en mesure d'utiliser le moins spécifique
java.util.Collection
(une interface quiList
s'étend).Comme pour
List<Cat>
(vous pouvez y lire que "la liste de chat") vsList
: c'est de Java les génériques, qui assurent le type de compilation en toute sécurité. En bref, il permet au compilateur assurez-vous que leList
ne contientCat
objets.bon point.
J'ai vu cet argument utilisé de nombreuses fois avant. Mais dans ce cas, il vous en fait voir qu'il est nécessaire de déclarer le type d'interface? Est-il un cas d'utilisation où l'on aurait initialiser un type de collection spécifique, ajouter des données à elle et puis un peu plus tard changé d'avis sur le type de collection?
href="http://programmers.stackexchange.com/q/225674/1845">programmers.stackexchange.com/q/225674/1845 et stackoverflow.com/a/505148/139010
OriginalL'auteur Matt Ball
Je ferais la suite.
OriginalL'auteur Peter Lawrey
Afin d'assurer la sécurité de type, et parce que les compilateurs Java va se plaindre si un type générique n'a pas de type d'argument, vous devez toujours spécifier un type de manière explicite ou
<?>
si vous n'avez vraiment pas de soins.Cela dit, sauf si vous utilisez quelque chose de spécifique à la
ArrayList
classe, vous devez utiliserList<Cat>
pour éviter d'encombrer votre code à un particulierList
mise en œuvre.OriginalL'auteur thkala
Comme Matt déjà déclaré, à l'aide de l'Interface la plus répandue/super-classe est la meilleure façon de le faire ici.
Assurez-vous de toujours déclarer le Type qui apparaît dans votre Liste, de sorte d'en faire un
List<Cat>
ou mêmeList<? extends Cat>
Si, à un moment plus tard, vous voulez remplacer le
ArrayList
avec, disons, uneLinkedList
, vous n'aurez pas à modifier la déclaration, mais seulement l'instanciation.OriginalL'auteur f1sh
List
est plus flexible queArrayList
,List<Cat>
est plus sûr queList
. doncList<Cat>
est un bon choix.OriginalL'auteur 卢声远 Shengyuan Lu
Tout d'abord,
List
est une interface etArrayList
est une mise en œuvre de laList
interface (en fait, il sous-classesAbstractList
etimplements List
). DoncList cats = new ArrayList()
est valable que depuisArrayList
est -List
.Pour cela:
cats
devient une crue de type (il n'y a pas de référence pour le Type Générique pourList
), il n'a pas été paramétré.Votre 3ème solution est correcte (il permet de résoudre votre problème pour l'option 1),
vous avez limité à un Type Générique
E
pourList<E>
à un typeCat
. Par conséquent, votre instanciation decats
est valable que pour le générique de cadre est le même.Votre 2ème solution qui permet seulement
ArrayList
decats
peut être instancié. Les 2 autres options vous permet d'instancier un objet qui est -List
, par exempleLinkedList
.OriginalL'auteur Buhake Sindi