Ce code marche très bien aujourd'hui, en tout cas sur mon PC.... Que faut t-il changer ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Map<String, List<String>> anagrams = new HashMap();
Ce code marche très bien aujourd'hui, en tout cas sur mon PC.... Que faut t-il changer ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Map<String, List<String>> anagrams = new HashMap();
J'ai voté pour, mais j'ai peur que ça complique encore la prise en main des generics.Il faut préciser le type de la Map, ce qui est normal, mais qui n'est pas évident à comprendre au début.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Map<String, ? extends Collection<? extends Image>> map; map = new HashMap<String, Set<BufferedImage>>();
Mais je vote pour.
Je suis pour et souhaite aussi que les deux syntaxes restent disponible...
Si cela est _impossible_... (Pas de raison, mais...) J'accepte quand meme, vu que le generique et l'instance ne sont que repetition de toutes facons...
Je suis également pour et ne vois pas non plus l'interet du <>, vu que la généricité est seulement un sucre syntaxique.
J'ai voté contre.
1. Par principe, je suis pour la séparation du type de la variable et du type de l'instance. J'irai meme jusqu'a imposer que le type d'une variable soit toujours une interface.
2. Si le but c'est la lisibilité alors le gain est vraiment minime. Autant carrément supprimer le mot clé new et faire des allocations facon "C":
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 HashMap<String, List<String>> anagrams;
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Mais j'ai hésité entre l'avantage de simplifier la lisibilité, et de complexifier la compréhension de la grammaire Java (de moins en moins accessible)
Dans l'idée de déclarer et instancier en une seule instruction j'avais aussi pensé à la syntaxe VB/LotusScript, qui a cependant ton inconvénient N°1: de ne pas utiliser d'interface:
De toutes façon, je trouve que c'est une peu du "sucre" syntaxique,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // pseudo VB de LotusScript dim session as new Session() //transposé en Java Generics new HashMap<String,Person>(10) annuaire;
est-ce qu'on ne pourrait pas carrément avoir un précompilateur comme en C, avec des des %Define et des typedefs, pour alléger les types trops longs à écrire?
ça remplirait finalement la même fonction.
dans l'exemple qui est donné je ne suis pas tellement gêné par la répétition, c'est plus l'absence de désignation de ce générique qui est problématique!
à la place de
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
Je préférai:
generic <String, List<String>> AnagramItem;
...
Map<AnagramItem> anagrams = new HashMap<AnagramItem>();
ce qui permettrait de facilement remplacer un type générique partout,
de faire de l'introspection sur les types génériques ...
Pas vraiment non car pouvoir faire de la reflection suppose que le bytecode stocke quelque part une information sur le type utilise ce qui n'est actuellement pas le cas (dans leur implementation actuelle, les generics ne sont que du sucre syntaxique pre-compilation pour eviter les casts manuels) sans que le programmeur ne s'en charge lui-meme.
Par contre, un typedef ou equivalent n'etait-il pas en discussion pour cette release ou une suivante ???
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
contre, l'apport de l'innovation ne change pas grand chose, même rien du tout. on a pris l'habitude de travailler ainsi.
Je suis contre, tant qu'il y a la mécanique d'autocomplétion dans la majorité des IDEs, cette forme d'instantiation ne va ajouter que de difficultés au niveau de la lisibilité du code et le rendre moins compréhensible sur tout quand elle est loin de la déclaration de la référence.
De la manière dont je l'ai compris, ce ne serait possible que dans le cas d'une instantiation en ligne... un peut comme pour les tableaux :
a++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int[] values = { 1, 2, 3, 4 }; // OK values = { 1, 2, 3, 4 }; // ERREUR values = new int[] { 1, 2, 3, 4 }; // OK
Egalement pour, et pour les mêmes raisons citées précedemment, redondance d'information, mais pour garder les 2 notations
Oui MAIS quel est l'interet de mettre <> dans l'appel au contructeur.
Ceci serait mieux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Map<String, List<String>> anagrams = new HashMap<>();
Pour le reste, l'information type est deja convoye dans la partie gauche de l'affectation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Map<String, List<String>> anagrams = new HashMap();
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Nous sommes tous semblables, alors acceptons nos différences !
--------------------------------------------------------------
Liens : Blog | Page DVP | Twitter
Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
Critiques : Apache Maven
Je pense qu'il ne faut pas trop en enlever non plus hein... Le fait de mettre "<>" indique clairement à l'oeil que ce n'est pas une "simple HashMap" qui est instanciée.
Et ça ferait quoi ce code là ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Map anagrams = (Map<String, List<String>>)new HashMap<>();
Milles excuses c'est vrai que les générics n'acceptent pas l'heritage et on ne peut pas faire de polymorphisme avec.
Snif.
Ben si justement, c'est tout la le probleme, ca ne reste que du sucre syntaxique au final on a bien une map toute simple et le compilateur qui met des cast la ou il faut dans le bytecode (en gros la ou on les mettait manuellement en java 1.4-). Donc aucune difference avec la creation d'une Map<Object, Object>.
On peut deja faire sans aucun probleme :Et ça ferait quoi ce code là ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Map anagrams = (Map<String, List<String>>)new HashMap<>();
Il est possible de caster HashMap<Object, Object> en Map<String, List<String>> et de recaster cette derniere en Map<Object, Object> . On a juste le warning habituel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Map anagrams = (Map<String, List<String>>)new HashMap();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Note: test\TestCast.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 test\TestCast.java:24: warning: [unchecked] unchecked cast found : java.util.HashMap required: java.util.Map<java.lang.String,java.util.List<java.lang.String>> Map anagrams = (Map<String, List<String>>)new HashMap(); ^ 1 warning
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Merci pour ces précisions bouye![]()
Partager