Java 返回不可变映射<;文件,文件>;

Java 返回不可变映射<;文件,文件>;,java,collections,immutability,guava,Java,Collections,Immutability,Guava,我有一个返回映射的方法。我最初会返回该方法生成的HashMap,但我认为最好返回一个ImmutableMap。不幸的是,以下语句拒绝在eclipse中工作: HashMap<File, File> map = new HashMap<File, File>(); map.put(...); . . . return ImmutableMap.builder ().putAll (map).build (); HashMap map=newhashmap(); 地图。放置

我有一个返回映射的方法。我最初会返回该方法生成的HashMap,但我认为最好返回一个ImmutableMap。不幸的是,以下语句拒绝在eclipse中工作:

HashMap<File, File> map = new HashMap<File, File>();
map.put(...);
.
.
.
return ImmutableMap.builder ().putAll (map).build ();
HashMap map=newhashmap();
地图。放置(…);
.
.
.
返回ImmutableMap.builder().putAll(map.build();
它一直说我返回了一个不兼容的语句,一个
Map

我最初尝试使用:

return ImmutableMap<File, File>.builder ().putAll (map).build ();
返回ImmutableMap.builder().putAll(map.build();
但这显然不起作用。我该如何着手解决这个问题呢?我应该先把它储存在类似的地方吗

ImmutableMap<File, File> m = ImmutableMap.builder ().putAll (map).build ();
ImmutableMap m=ImmutableMap.builder().putAll(map.build();
还是有更优雅的解决方案?

应该可以


根据您的要求,
集合。不可修改地图(map)
也可能适合您。不同之处在于,不可变映射是原始映射的副本,而不可修改映射是原始映射的视图,如果原始映射更改,视图也将更改。

正确的语法是

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

这避免了需要显式类型参数来交换新的局部变量,在这种情况下IMHO不会增加可读性。另一方面,如果您多次向生成器添加,我更喜欢局部变量而不是长调用链。在只有一个
putAll
调用的特殊情况下,一个
copyOf
可以在一行中避免使用类型参数。

eclipse中的错误消息是什么?很抱歉。我添加了你要求的信息。真不敢相信我错过了
copyOf
方法。不,我在ImmutableMap上设置得很好,因为数据不应该更改。我不明白为什么构建器返回两个
对象的映射,而不是两个
文件的映射。因为调用泛型方法时需要指定具体的类型。我会将其拆分为多行,这样就避免了使用类型暗示的特殊调用语法。
Builder<File, File> builder = ImmutableMap.builder();
builder.putAll(map);
return builder.build();