返回ImmutableMap <文件,文件>

ces*_*sar 16 java collections immutability guava

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

HashMap<File, File> map = new HashMap<File, File>();
map.put(...);
.
.
.
return ImmutableMap.builder ().putAll (map).build ();
Run Code Online (Sandbox Code Playgroud)

它一直在说我正在回复一个不相容的陈述,a Map<Object, Object>.

我最初尝试使用:

return ImmutableMap<File, File>.builder ().putAll (map).build ();
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用.我最好如何解决这个问题?我应该先将它存储在类似的东西中

ImmutableMap<File, File> m = ImmutableMap.builder ().putAll (map).build ();
Run Code Online (Sandbox Code Playgroud)

还是有更优雅的解决方案?

Chr*_*rau 26

正确的语法是

return ImmutableMap.<File, File> builder().putAll(map).build();
Run Code Online (Sandbox Code Playgroud)

请注意,点泛型之前,因为泛型属于方法调用,而不是类.

正如Bozho所指出的,您需要在调用泛型方法时指定泛型类型.有时,如果编译器可以推断它们,则不需要.但是类型推断是非常有限的,并且通常仅适用于方法参数,例如copyOf方法:该方法是通用的,但编译器可以从方法参数推断泛型类型.

更新:加布里埃尔建议将声明分成多行,如下所示:

Builder<File, File> builder = ImmutableMap.builder();
builder.putAll(map);
return builder.build();
Run Code Online (Sandbox Code Playgroud)

这避免了对显式类型参数的需要以换取新的局部变量,在这种情况下IMHO不会增加可读性.另一方面,如果你多次添加到构建器,我更喜欢长调用链上的局部变量.在只有一次putAll调用的特殊情况下,copyOf相反,在单行中提供了避免类型参数的好处.


Boz*_*zho 17

ImmutableMap.copyOf(map) 应该做.

根据您的要求,Collections.unmodifiableMap(map)也可能适合您.不同之处在于,不可变地图是原始地图的副本,而不可修改地图是原始地图的视图,如果原始地图发生变化,则视图也会发生变化.

  • 因为在调用泛型方法时需要指定具体类型. (3认同)