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

时间:2016-07-05 16:29:16

标签: java collections literals xtend

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

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 docs

  

此外,xtend支持集合文字以创建不可变集合和数组,具体取决于目标类型

所以我想我可以控制我回来的不可修改地图的类型。

Xtend版本:2.9.0

2 个答案:

答案 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>