为什么 Guava LoadingCache 的 getAll 方法 returns 不同类型的 ImmutableMap?

Why getAll method of Guava LoadingCache returns different types of ImmutableMap?

我有一个简单的 Guava LoadingCache 用例,我将关键对象列表传递给 getAll 并实现 loadAll 以在缓存中不可用时获取结果。

问题是当缓存为空时,

这最终会导致另一个问题。当我尝试在其上收集 map.values() 时,RegularImmutableMap returns 一种 ImmutableListSingletonImmutableBiMap returns 一种 ImmutableSet .

从用户的角度来看,是否有任何特定的reason/advantage为什么getAll方法returns不同类型的ImmutableMap

请注意,这与 Cache 无关 - 您可能在 return 收集的结果之前简单地使用 calls ImmutableMap.copyOf()LocalCache 实现。

所以您的根本问题实际上是 为什么 ImmutableMap.of(K, V) return an ImmutableBiMap

这是 since 2012 的行为,简短的回答是因为 ImmutableBiMap 扩展了 ImmutableMap,因此不需要同时拥有 SingletonImmutableMap 和 [=18] =]实施。

正如matoni所说,ImmutableMap.values() returns an ImmutableCollection, therefore you cannot rely on a particular implementation to return an ImmutableList or an ImmutableSet (or some other mysterious type that extends ImmutableCollection). Not only that, you cannot rely on the existing behavior staying this way! For a brief while (from February to June) ImmutableMap实际上并没有使用ImmutableBiMap

这意味着您不应期望 ImmutableMap.values() 到 return 和 ImmutableList,任何这样做的代码都会被破坏。如果您需要 ImmutableCollection 中的 ImmutableList,请使用 .asList() - 对于大多数不可变集合,这可以 return O(1) 时间内的视图和 space.