我尝试使用目标类型来指定集合文字的类型:
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错误。出于某种原因,即使目标类型为Set
,Xtend也会尝试生成HashMap
。
但是,如果我将目标类型更改为Map
,它会按预期生成地图。
此外,xtend支持集合文字以创建不可变集合和数组,具体取决于目标类型
所以我想我可以控制我回来的不可修改地图的类型。
Xtend版本:2.9.0
答案 0 :(得分:1)
你不能以你想要的方式做到这一点 - 隐式转换不会为你改变地图文字的类型(你得到的错误是编译器工件 - 它在一组对和地图文字之间混淆)。你可以做的是
val map = Maps.newHashMap(#{
'a' -> 'b'
})
可能更少打字;)地图来自com.google.common.collect,您将与依赖项中的xtend一起使用。
答案 1 :(得分:1)
引自Xtend doc:
此外,xtend支持集合文字以创建不可变集合和数组,具体取决于目标类型。
表示 集合,或数组 - 因为两者的文字语法都相同:
val mySet = #{'Hello', 'World'}
val myMap = #{'a' -> 1, 'b' -> 2}
集合和映射具有不同的语法,因此无需在此处指定目标类型:
val myHashMap = newHashMap('a' -> 1, 'b' -> 2)
如果您坚持目标类型,请使用例如newHashMap
:
<!DOCTYPE html>
<html>
<head>
<link data-require="bootstrap-css@3.3.6" data-semver="3.3.6"
rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" />
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-xs-1">
a
</div>
<div class="col-xs-10">
bbb
</div>
<div class="col-xs-1">
c
</div>
</div>
<div class="row">
<div class="col-xs-2">
a
</div>
<div class="col-xs-8">
bbb
</div>
<div class="col-xs-2">
c
</div>
</div>
</div>
</body>
</html>