我有一个返回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 ();
还是有更优雅的解决方案?
答案 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)
也可能适合您。区别在于不可变地图是原始地图的副本,而不可修改地图是原始地图的视图,如果原始地图发生变化,则视图也会发生变化。