返回ImmutableMap <file,file =“”> </file,>

时间:2011-08-07 15:11:32

标签: java collections immutability guava

我有一个返回Map的方法。我最初会返回该方法生成的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 ();

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

2 个答案:

答案 0 :(得分:25)

正确的语法是

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

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

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

更新:Gabriel建议将语句分成多行,如下所示:

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

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

答案 1 :(得分:17)

ImmutableMap.copyOf(map)应该这样做。

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