Возврат неизменной карты - PullRequest
       51

Возврат неизменной карты

16 голосов
/ 07 августа 2011

У меня есть метод, который возвращает карту. Сначала я бы возвратил HashMap, сгенерированный методом, но подумал, что будет лучше вернуть ImmutableMap. К сожалению, следующее утверждение отказывается работать в затмении:

HashMap<File, File> map = new HashMap<File, File>();
map.put(...);
.
.
.
return ImmutableMap.builder ().putAll (map).build ();

Постоянно говорится, что я возвращаю несовместимое утверждение, Map<Object, Object>.

Я изначально пытался использовать:

return ImmutableMap<File, File>.builder ().putAll (map).build ();

но это явно не сработало. Как мне лучше всего исправить это? Должен ли я сначала сохранить его в что-то вроде

ImmutableMap<File, File> m = ImmutableMap.builder ().putAll (map).build ();

или есть более элегантное решение?

Ответы [ 2 ]

25 голосов
/ 07 августа 2011

Правильный синтаксис:

return ImmutableMap.<File, File> builder().putAll(map).build();

Обратите внимание, что точка равна перед обобщениями, потому что обобщенные элементы относятся к вызову метода, а не к классу.

Как отметил Божо, вам нужно указывать универсальные типы при вызове универсальных методов.Иногда вам не нужно, если компилятор может их определить.Но вывод типов очень ограничен и обычно работает только с аргументами метода, как для метода copyOf: этот метод является универсальным, но компилятор может вывести универсальные типы из аргумента метода.

ОБНОВЛЕНИЕ: Габриэль предложил разбить оператор на несколько строк, например:

Builder<File, File> builder = ImmutableMap.builder();
builder.putAll(map);
return builder.build();

Это позволяет избежать необходимости явных параметров типа в обмен на новую локальную переменную, которую IMHO не добавляетдля читабельности в этом случае.С другой стороны, если вы добавите в конструктор несколько раз, я бы предпочел локальную переменную длинной цепочке вызовов.В особом случае только одного putAll вызова copyOf вместо этого дает преимущество избегать параметров типа в однострочнике.

17 голосов
/ 07 августа 2011

ImmutableMap.copyOf(map) должно сделать.

В зависимости от ваших требований, Collections.unmodifiableMap(map) также может подойти вам. Разница в том, что неизменяемая карта является копией исходной карты, в то время как неизменяемая карта является видом оригинала, и если оригинал изменится, вид также изменится.

...