Возврат ImmutableMap <Файл, Файл>

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

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

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

Ответ 1

Правильный синтаксис будет

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

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

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

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

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

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

Ответ 2

ImmutableMap.copyOf(map).

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