2011-11-17 6 views
2

Je passe en revue un autre code de Grails et je vois ce qui suit:Conversion de type implicite?

Set<Integer> weeks = new ArrayList<Integer>() 

Il ressemble après cette ligne est définie, Grails pense que les semaines est un HashSet. Je ne suis pas bien versé dans Java ou Grails, et la documentation (java) ressemble à ArrayList étend List et HashSet étend Set, mais que cette construction directe ne fonctionnerait pas. Est-ce une chose Grails? Merci.

+0

Je ne sais pas Grail, Mais est-ce que ce code compile bien? n'y a-t-il pas d'erreur TypeMismatch> – Zohaib

Répondre

4

Il est quelque peu inhabituel dans Groovy de voir new ArrayList<Integer>() puisque [] fonctionne de manière identique et est beaucoup moins verbeux, donc j'aurais écrit cela comme Set<Integer> weeks = []. Ensuite, c'est un peu plus clair sur ce qui se passe - Groovy convertit un type de collection en un autre, avec le [] vraiment comme un moyen pratique de créer un support et de remplir les données initiales (s'il y en a). Comme il n'y a pas de sucre syntaxique pour les collections autres que [] pour List et [:], vous avez besoin de ces conversions.

def weeks = [] as Set est probablement la syntaxe la plus courante. C'est aussi plus clair puisque [] est juste temporaire et l'utilisation de "as" fait la conversion, et plus explicitement que simplement déclarer le type sur le côté gauche.

Vous pouvez également utiliser ceci pour convertir des collections en tableaux. Vous ne pouvez pas utiliser la syntaxe Java pour créer des tableaux car elle utilise des accolades et ressemble à une définition de fermeture. Par conséquent, au lieu de int[] numbers = new int[] { 1, 2, 3 }, vous devez exécuter int[] numbers = [1, 2, 3] ou def numbers = [1, 2, 3] as int[].

Questions connexes