Java 1.5
Mais ce que je veux dire c'est que ce n'est pas une transposition des enums du C/C++
Les Templates correspondent à une sorte de surcouche du langage. Grosso-modo c'est comme si tu faisait un gros replace sur le code avant chaque utilisation d'un type template En fait c'est le compilateur qui le fait à ta place...
Les Generics sont véritablement intégré dans le langage (la reflection permet de récupérer certaines infos relatives aux Generics), et évites la duplication du code (toutes les classes Generics sont du même types).
Le gros défaut actuel étant que le type du paramétrage est perdu à l'exécution (sauf dans certains cas spécifique) puisque chaque instance d'un type paramétré appartient au même type (une List<String> est strictement du même type qu'une List<Integer>).
Sans oublier les notions de variances qui apportent encore plus de généricité au code (j'y reviens plus bas).
A mon avis cela apporte autant que les classes en comparaison des simples structures
Le détail le plus utile c'est qu'une enum possède un toString() bien propre, si bien que ceci affichera le libellé de l'enum et non pas une valeur entière peu utile :
Mais on a également la possibilité de parcourir facilement les valeurs d'une enum voir de faire la conversion String -> enum :
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.println( monEnum );
Sans compter les méthodes associé à une valeur de l'enum. Un petit exemple dans l'API standard avec TimeUnit : http://javasearch.developpez.com/j2s.../TimeUnit.html
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for (MyEnum e : MyEnum.values()) { System.out.println(e); } MyEnum.valueOf("A"); // retourne MyEnum.A
Et ? Cela ne prouve pas qu'ils s'en sont inspiré...
Surtout qu'on ne peut pas dire qu'ils aient pris la même directement...(l'intégration des Generics dans Java n'a pas entrainé une cassure dans l'API).
Hum Hum ... La variance existe déjà en Java, et ce depuis l'intégration des Generics dans Java 1.5 en 2004...
Elle prend par contre une forme quelque peu différente : elle n'a pas besoin d'être défini dans l'interface mais peu s'utiliser n'importe où par simple déclaration, par exemple :
Pour info la variance permet d'utiliser un type Generics partiellement, en faisant des suppositions sur son type. Par exemple une List<? extends Number> peut correspondre à une liste de type étendant Number.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 List<? extends Object> list = new ArrayList<String>(); List<? super Double> list = new ArrayList<Number>();
Comme on ne connais pas le type précis il est impossible d'ajouter des éléments dans cette liste, mais on peut très bien parcourir ses données.
Petit exemple :
Cette méthode accepte en paramètre n'importe quelle liste paramétré avec un type étendant Number. Sans covariance on serait obligé de dupliquer la méthode car le typeage est trop fort...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public double sum(Iterable<? extends Number> values) { double result = 0.0; for (Number n : values) { result += n.doubleValue(); } return result; }
a++
Partager