2016-07-05 2 views
0

私はコレクションのリテラルのタイプを指定するターゲット・タイプを使用しようとしている:コレクションリテラルのターゲットタイプを指定する方法は?

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

をしかし、私は取得:これはJavaのコンパイルエラーではなく、XTEND一つであること

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

注意を。何らかの理由で、ターゲットタイプがHashMapであっても、XtendはSetを生成しようとしています。

ただし、ターゲットタイプをMapに変更すると、期待どおりのマップが生成されます。

Xtend docsが加算XTENDで

ので、私は私が取得変更不可能なマップの種類を制御できると思っていたターゲット型

に応じて、不変コレクションと配列を作成するために、コレクションリテラルをサポートして言いますバック。

XTENDバージョン:あなたはあなたが望むそのように行うことができません2.9.0

答えて

1

- 暗黙的な変換はあなたのためのリテラルマップの種類は変更されません(あなたが取得しているバグは、コンパイラのアーティファクトである - それは、一連の間で混乱ペアとマップリテラル)。マップはあなたが依存関係にあるXTENDと一緒に取得しますcom.google.common.collect、からである);あなたが代わりに行うことができますすることはおそらく少ないタイピングで

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

です。 Xtend docから引用

+0

ニース。あなたの答えを見た後、純粋なjavaのための[類似の解決策](http://stackoverflow.com/a/7345751/498594)が見つかりました。 – Kelvin

1

を加算XTENDでは、ターゲット・タイプに応じて、不変コレクションと配列を作成するために、コレクションリテラルをサポートしています。

リテラル構文の両方に同じであるので、いずれかコレクション、または配列—を意味します

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) 
関連する問題