返回不可变映射<文件、文件>

2022-09-03 03:48:33

我有一个返回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 ();

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


答案 1

正确的语法是

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

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

正如 Bozho 所指出的,在调用泛型方法时,您需要指定泛型类型。有时,如果编译器可以推断它们,则不需要这样做。但是类型推断非常有限,通常只适用于方法参数,就像方法一样:该方法是泛型的,但编译器可以从方法参数中推断出泛型类型。copyOf

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

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

这避免了需要显式类型参数来交换新的局部变量,恕我直言,在这种情况下,这不会增加可读性。另一方面,如果您多次添加到构建器中,我更喜欢局部变量而不是长调用链。在只有一个调用的特殊情况下,a 反而提供了在单行中避免的类型参数的好处。putAllcopyOf


答案 2

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

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