为什么 Guava LoadingCache 的 getAll 方法 returns 不同类型的 ImmutableMap?
Why getAll method of Guava LoadingCache returns different types of ImmutableMap?
我有一个简单的 Guava LoadingCache 用例,我将关键对象列表传递给 getAll
并实现 loadAll
以在缓存中不可用时获取结果。
问题是当缓存为空时,
- 调用
getAll
收集记录 returns RegularImmutableMap
类型的映射。
- 并调用
getAll
收集 单条记录 returns SingletonImmutableBiMap
. 类型的映射
这最终会导致另一个问题。当我尝试在其上收集 map.values()
时,RegularImmutableMap
returns 一种 ImmutableList
和 SingletonImmutableBiMap
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.
我有一个简单的 Guava LoadingCache 用例,我将关键对象列表传递给 getAll
并实现 loadAll
以在缓存中不可用时获取结果。
问题是当缓存为空时,
- 调用
getAll
收集记录 returnsRegularImmutableMap
类型的映射。 - 并调用
getAll
收集 单条记录 returnsSingletonImmutableBiMap
. 类型的映射
这最终会导致另一个问题。当我尝试在其上收集 map.values()
时,RegularImmutableMap
returns 一种 ImmutableList
和 SingletonImmutableBiMap
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.