2016-07-05 2 views
0

Je suis en train d'utiliser un type de cible pour spécifier une collection de type de littéral:Comment spécifier le type de cible pour les littéraux de collection?

val java.util.HashMap<String,String> map = #{ 
    'a' -> 'b' 
} 

mais je reçois:

HelloWorld.java:212: error: incompatible types: Set<Object> cannot be converted to HashMap<String,String> 
    final HashMap<String, String> map = Collections.<Object>unmodifiableSet(CollectionLiterals.<Object>newHashSet(_mappedTo, _mappedTo_1, _mappedTo_2, _mappedTo_3)); 

Notez que ceci est une erreur de compilation java, pas un Xtend un. Pour une raison quelconque, Xtend essaie de générer un Set même si le type de cible est un HashMap.

Cependant, si je change le type de cible à Map, il génère une carte comme prévu.

Le Xtend docs disent

En plus Xtend soutient la collecte littéraux pour créer des collections et des tableaux immuables, en fonction du type cible

donc je pensais que je pouvais contrôler le type de carte non modifiable je reçois arrière.

Version Xtend: 2.9.0

Répondre

1

Vous ne pouvez pas le faire de cette façon que vous voulez - conversion implicite ne changera pas le type de carte littérale pour vous (bug que vous obtenez est l'artefact du compilateur - il se confond entre ensemble de paires et littéraux de carte). Ce que vous pouvez faire à la place est

val map = Maps.newHashMap(#{ 
     'a' -> 'b' 
    }) 

qui est probablement encore moins taper;) Maps est de com.google.common.collect, que vous retrouveras Xtend dans les dépendances.

+0

Nice. Après avoir vu votre réponse, j'ai trouvé une [solution similaire] (http://stackoverflow.com/a/7345751/498594) pour Java pur. – Kelvin

1

Cette citation de Xtend doc:

En plus Xtend prend en charge les littéraux de collecte pour créer des collections immuables et des tableaux, en fonction du type de cible.

signifie soit une collection, ou un tableau — depuis tant pour la syntaxe littérale est la même:

val myList = #['Hello', 'World'] 
val String[] myArray = #['Hello', 'World'] 

ensembles et des cartes ont à la fois une syntaxe différente, donc pas besoin de spécifier le type de cible ici:

val mySet = #{'Hello', 'World'} 
val myMap = #{'a' -> 1, 'b' -> 2} 

Si vous insistez sur le type de cible, utilisez par exemple newHashMap:

val myHashMap = newHashMap('a' -> 1, 'b' -> 2)