2016-07-05 11 views
0

Ich versuche, einen Zieltyp zu verwenden, um eine Sammlung wörtlichen dem Typen angeben:Wie wird der Zieltyp für Sammlungsliterale angegeben?

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

Aber ich bekomme:

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

Beachten Sie, dass dies ein Java-Kompilierungsfehler ist, kein Xtend ein. Aus irgendeinem Grund versucht Xtend, einen Set zu generieren, obwohl der Zieltyp ein HashMap ist.

Wenn ich jedoch den Zieltyp in Map ändere, erzeugt es eine Karte wie erwartet.

Die Xtend docs sagen

Zusätzlich Sammlung Literale xtend unterstützt unveränderliche Sammlungen und Arrays zu erstellen, auf dem Zieltyp abhängig

so dachte ich, dass ich die Art der unmodifiable Karte steuern konnte ich zurück.

Xtend Version: 2.9.0

Antwort

1

Sie nicht so tun können, die Sie wollen - implizite Konvertierung wird nicht die Art von Karte für Sie wörtliche ändern (Bug Sie bekommen ist Compiler Artefakt - es zwischen Satz durcheinander Paare und Kartenliterale). Was können Sie stattdessen tun ist

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

die wahrscheinlich sogar weniger tippen;) Karten von com.google.common.collect ist, die Sie mit xtend in Abhängigkeiten zusammenkommen wird.

+0

Schön. Nachdem ich deine Antwort gesehen hatte, fand ich eine [ähnliche Lösung] (http://stackoverflow.com/a/7345751/498594) für reines Java. – Kelvin

1

, die aus Xtend doc zitieren:

Zusätzlich unterstützt xtend Sammlung Literale unveränderliche Sammlungen und Arrays zu erstellen, auf dem Zieltyp abhängig.

bedeutet entweder eine Sammlung, oder ein Array — da sowohl für die Literalsyntax ist das gleiche:

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

Sets und Karten haben beide eine andere Syntax, so dass keine Notwendigkeit angeben, der Zieltyp hier:

Wenn Sie auf dem Zieltyp bestehen, verwenden Sie z newHashMap:

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