2010-12-11 7 views
3

Quelqu'un peut-il expliquer quelle est la différence entre ces deux instanciations de la classe ArrayList?Transmettre la variable de type lors de l'instanciation d'une classe générique

List<Integer> intList = new ArrayList(); 
List<Integer> intList = new ArrayList<Integer>(); 

Je savais que le compilateur efface la variable de type, à savoir Integer, lors de la compilation à bytecode et l'exemple ci-dessus fonctionne aussi bien exactement la même chose. Je me demande s'il y a un quelconque avantage à passer la variable de type (Integer) sur le côté droit puisqu'elle est déjà déclarée sur la gauche? Autant que je peux trouver sur le web, ils utilisent tous le dernier, mais je ne vois pas pourquoi je devrais le déclarer deux fois des deux côtés.

+1

Il y a la fonction Project Coin de l'opérateur du diamant ('<>'), que je pense être dans JDK7, qui vous permet d'écrire 'List ints = new ArrayList <>();'. L'algorithme de détermination du type fonctionne de la même manière que pour les méthodes génériques. –

+0

Je suis à la recherche des nouvelles fonctionnalités de JDK7. C'est une bonne. – gigadot

Répondre

2

La version sans le paramètre type entraîne un avertissement, car il peut ne pas être sécurisé. Dans votre cas, ce n'est pas un problème car la liste est vide, mais en général c'est le cas. Par exemple

List<String> stringList = new ArrayList<String>(); 
stringList.add("foo"); 
List<Integer> intList = new ArrayList(stringList); // Warning about unchecked conversion 
int i = intList.get(0); // Oops, throws a ClassCastException 

donc pour assurer la sécurité de type il est préférable de se débarrasser de l'avertissement en ajoutant les paramètres de type partout.

3

Ce sont deux choses différentes. Le côté gauche est le type de votre variable. Le côté droit est le type de l'objet que vous créez. Le compilateur créera d'abord l'objet en utilisant le type que vous lui avez donné sur le côté droit, puis assignera la référence à la variable sur votre gauche.

Dans votre cas, il n'y a pas de différence car une ArrayList a le même constructeur dans tous les cas. Cependant:

  • Dans d'autres classes, le constructeur peut se comporter différemment en fonction du type spécifique que vous fournissez.
  • Vous rendrez la tâche plus facile au compilateur si vous faites correspondre le type. Dans la première version, le compilateur devra assigner un objet de type ArrayList à une variable qui attend un type List<Integer>. Dans certains cas, vous pouvez recevoir un avertissement parce que les types ne correspondent pas clairement.
0

Vous vouliez sans doute la différence entre:

List intList = new ArrayList(); 
List<Integer> intList = new ArrayList<Integer>(); 

Ils sont tous les deux en même temps d'exécution. Mais il y a de grandes différences dans le temps de compilation.