如何为集合文字指定目标类型?

How to specify target type for collection literals?

我正在尝试使用目标类型来指定集合文字的类型:

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 错误。出于某种原因,Xtend 试图生成 Set,即使目标类型是 HashMap

但是,如果我将目标类型更改为 Map,它会按预期生成地图。

Xtend docs

In addition xtend supports collection literals to create immutable collections and arrays, depending on the target type

所以我认为我可以控制返回的不可修改地图的类型。

Xtend 版本:2.9.0

您不能按照您想要的方式进行 - 隐式转换不会为您更改地图文字的类型(您遇到的错误是编译器工件 - 它会在成对集合和地图文字之间混淆)。你可以做的是

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

这可能更少打字 ;) 地图来自 com.google.common.collect,您将在依赖项中与 xtend 一起获得。

引用自Xtend doc

In addition xtend supports collection literals to create immutable collections and arrays, depending on the target type.

表示 一个集合, 一个数组——因为两者的字面语法是相同的:

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

集合和映射的语法不同,因此无需在此处指定目标类型:

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

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

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