2016-07-05 34 views
0

我试图用一个目标类型指定一个集合字面的类型:如何为集合文字指定目标类型?

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

,但我得到:

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)); 

请注意,这是一个Java编译错误,而不是一个的Xtend一个。由于某种原因,即使目标类型为HashMap,Xtend也试图生成Set

但是,如果我将目标类型更改为Map,它会按预期生成一个映射。

Xtend docs

此外XTEND支持收集文字创建不可改变集合和数组,根据目标类型

,所以我想我能控制不可修改的地图,我得到的类型背部。

的Xtend版本:2.9.0

回答

1

你不能做你想要的方式 - 隐式转换不会改变地图文字的类型,你(的错误你得到是编译器神器 - 它得到一套之间混淆对和地图文字)。你可以做的反而是

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

这可能是打字甚至更少;)地图是从com.google.common.collect,你将与依赖XTEND聚会。

+0

不错。看到你的答案后,我发现了一个[类似的解决方案](http://stackoverflow.com/a/7345751/498594)纯Java。 – Kelvin

1

Xtend doc引用:

此外XTEND支持收集文字创建不可改变集合和数组,根据目标类型。

装置集合,因为两者的文本语法阵列—是相同的:

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

集与地图有两个不同的语法,因此不需要指定目标类型如下:

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

如果您坚持使用目标类型,请使用eg newHashMap

val myHashMap = newHashMap('a' -> 1, 'b' -> 2) 
相关问题