2009-06-29 4 views

Répondre

14

C'est l'utilisation de génériques. Cochez cette case intro. Et puis n'oubliez pas de lire ceci tutorial.

En voici un extrait (qui compare l'utilisation d'une distribution par rapport à l'utilisation des médicaments génériques):

Quand vous voyez le code < type>, lisez comme « de type »; la déclaration ci-dessus se lit comme "Collection de chaîne c." Le code en utilisant des génériques est plus clair et plus sûr. Nous avons éliminé une fonte non sécuritaire et un certain nombre de parenthèses supplémentaires . Plus important encore, nous avons déplacé une partie de la spécification de la méthode d'un commentaire à sa signature , de sorte que le compilateur peut vérifier au moment de la compilation que le type les contraintes ne sont pas violés lors de l'exécution temps. Parce que le programme compile sans avertissements, nous pouvons affirmer avec qu'il ne lancera pas une ClassCastException lors de l'exécution. L'effet net de l'utilisation de génériques, en particulier dans les grands programmes, est amélioration de la lisibilité et la robustesse.

Par exemple, l'interface d'une liste est

public interface List<E> { 
    void add(E x); 
    Iterator<E> iterator(); 
} 

Cela signifie que vous pouvez construire une liste dont le contenu sont tous du même type explicite (non seulement de type Object), même si vous avez défini le type vous-même. Donc, si vous créez une classe de nom vous pouvez écrire

List<Name> nameList = new List<Name>(); 

puis le remplir avec les instances de nom et de récupérer directement les instances de nom de sans avoir à jeter ou autrement inquiéter à ce sujet parce que vous aurez toujours un nom instance ou null retour, jamais une instance d'un type différent. Plus important encore, vous ne pouvez pas insérer quelque chose de différent d'une instance de nom dans une telle liste, car elle échouera au moment de la compilation.

nameList.add(false); //Fails! 
nameList.add(new Name("John","Smith")); //Succeeds supposing Name has a 
             //firstName, lastName constructor 
+0

J'ai lu 'List ' comme "Liste des types" comme si T est l'abréviation de Type. J'ai noté '' dans beaucoup de code. Est-ce court pour quoi que ce soit? Ou devrais-je juste le lire comme "Collection d'Es" – Aust

16

Cela signifie que vous traitez une collection d'éléments de type E. Imagine que tu as une tasse de thé. Au lieu de thé, il pourrait également tenir le café donc il est logique de décrire la coupe comme une entité générique:

class Cup<T> { … } 
maintenant

vous pourriez le remplir, que ce soit avec du café ou du thé (ou autre chose):

Cup<Tea> cuppa = new Cup<Tea>(); 
Cup<Coffee> foamee = new Cup<Coffee>(); 

Pour que cela fonctionne, les types Tea et Coffee doivent également être définis dans votre programme.

Il s'agit d'une contrainte de compilation sur votre code.En revenant de l'exemple de tasse (plutôt inutile), les collections (tableaux, listes ...) contiennent généralement des éléments de type un type, par ex. entiers ou chaînes. Les génériques vous aident à exprimer ceci en Java:

Collection<String> strList = new ArrayList<String>(); 
strList.add("Foobar"); // Works. 
strList.add(42);  // Compile error! 

Vous remarquez l'erreur de compilation ci-dessus? Vous obtenez seulement ceci en employant des génériques. Le code suivant fonctionne également, mais ne donnerait pas le bon message d'erreur:

Collection strList = new ArrayList(); 
strList.add("Foobar"); // Works. 
strList.add(42);  // Works now. Do we really want this?! 
+0

bonne explication :) – Johanna

+2

Un contact déroutant que la classe Cup serait effectivement prononcé une tasse de T :) – johnc

+1

@lagerdalek: qui n'a pas échappé à mon attention du tout. ;-) En fait, cette explication est inspirée par ceci: http://www.zazzle.com/c_cup_of_t_mug-168503670567870702 –

Questions connexes