приведение LinkedHashMap к HashMap в заводной - PullRequest
5 голосов
/ 23 сентября 2010

Как мне преобразовать LinkedHashMap в java.util.HashMap в groovy?

Когда я создаю что-то подобное в groovy, автоматически создается LinkedHashMap, даже когда я объявляю его как HashMap h = .... или def HashMap h = ...

Я пытался сделать:

HashMap h = ["key1":["val1", "val2"], "key2":["val3"]]

и

def HashMap h = ["key1":["val1", "val2"], "key2":["val3"]]

h.getClass().getName() все еще возвращается с LinkedHashMap.

Ответы [ 4 ]

6 голосов
/ 23 сентября 2010

LinkedHashMap является подклассом HashMap, поэтому вы можете использовать его как HashMap.


Ресурсы:

3 голосов
/ 14 октября 2010

Простой ответ - карты имеют нечто похожее на конструктор копирования:

Map m = ['foo' : 'bar', 'baz' : 'quux'];
HashMap h = new HashMap(m);

Итак, если вы привязаны к буквенной нотации, но вам абсолютно необходима другая реализация, это сработает.

Но на самом деле вопрос в том, почему вас волнует, что лежит в основе реализации? Вам даже не нужно беспокоиться, что это HashMap. Тот факт, что он реализует интерфейс Map, должен быть достаточным практически для любых целей.

2 голосов
/ 19 марта 2011

Вероятно, его поймали на страшном Groovy-Map-Gotcha, и он спотыкался в глуши возможностей, как и я весь день.

Вот сделка:

При использовании переменных строковых ключей вы не можете получить доступ к карте в формате обозначения свойств (например, map.a.b.c), что-то неожиданное в Groovy, где все в общем лаконично и замечательно; -)

Обходной путь - заключать переменные ключи в парены вместо кавычек.

def(a,b,c) = ['foo','bar','baz']  
Map m = [(a):[(b):[(c):1]]]  
println m."$a"."$b"."$c" // 1  
println m.foo.bar.baz // also 1

Создание такой карты принесет большое удовольствие садистам всего мира:

Map m = ["$a":["$b":["$c":1]]]

Надеюсь, это спасет другого Groovy-ist от временного безумия ...

1 голос
/ 23 сентября 2010
 HashMap h = new HashMap() 
 h.getClass().getName();

работает.Использование нотации [:], кажется, связывает ее с LinkedHashMap.

...