的视图我有一个Iterable<Map<? extends K, ? extends V>>
,我想提供这些地图的入口集合的视图,即Set<Map.Entry<K, V>>
。创建多个地图'entrySets
我可以构建一个新的Set
像这样(铸造触发未检查的警告,但编译):
ImmutableSet.Builder<Map.Entry<K, V>> builder = ImmutableSet.builder();
for(Map<? extends K, ? extends V> map : chain) {
for(Map.Entry<? extends K, ? extends V> e : map.entrySet()) {
builder.add((Map.Entry<K, V>) e);
}
}
return builder.build();
然而,这需要复制集,而在同步与背地图不留。我已经试过了诸如:
Set<Map.Entry<K, V>> unionSet = ImmutableSet.of();
for(Map<? extends K, ? extends V> map : chain) {
unionSet = Sets.union((Set<Map.Entry<K, V>>)map.entrySet(), unionSet);
}
return unionSet;
但这无法编译,出现错误:
Cannot cast from Set<Map.Entry<capture#27-of ? extends K, capture#28-of ? extends V>> to Set<Map.Entry<K,V>>
我希望类似的不安全的演员,但似乎禁止在这种情况下,大概是由于嵌套泛型。
所以两个问题:
- 为什么这种铸造的禁止,但顶级通用的类型转换被允许?
- 有没有更好的方法来提供这些集合的联合(类型
Set<Map.Entry<K, V>>
)?
那么,或者使用'Set <?扩展Map.Entry <?延伸K,?扩展V >>'。或者在整个代码中使用'Map'。 –
我实际上已经完成并清理了'chain',它是'Iterable