2016-07-05 33 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) 
相關問題