是否可以将SortedMap的keySet()安全地转换为SortedSet?

时间:2012-09-14 15:07:05

标签: java collections

我有一个SortedMap,根据其键的自然顺序排序。我可以安全地将其keySet()强制转换为SortedSet,而不会冒无效的强制转换异常。

那就是,下面会抛出吗?

SortedMap<K, V> map = ...;
SortedSet<K> set = (SortedSet<K>) map.keySet();

如果答案是“取决于SortedMap的实施”,这对于TreeMap至少是安全的吗?

4 个答案:

答案 0 :(得分:15)

对于SortedMap一般来说,不是,因为它没有记录在javadoc中。

但是,TreeMap也会实现NavigableMapNavigableSet使用NavigableSet作为键集,SortedSet扩展NavigableMap<K, V> map = ...; //can be a TreeMap or a ConcurrentSkipListMap SortedSet<K> set = map.navigableKeySet(); ...

所以你可以做的是:

{{1}}

答案 1 :(得分:8)

SortedMap<String, String> treeMap = new TreeMap<String, String>();
// prints true
System.out.println(treeMap.keySet() instanceof SortedSet);   
// prints false
System.out.println(Collections.synchronizedSortedMap(treeMap).keySet() instanceof SortedSet); 

所以答案是否定的。

TreeMap.keySet()返回SortedSet,但javadoc无法保证。

扩展NavigableMap的{​​{1}}界面采用SortedMap方法,可以重新调整navigableSet() NavigableSet,但{。}}。

答案 2 :(得分:4)

鉴于文档不保证它将是SortedSet,即使当前实现以这种方式实现(并且我还没有检查它们是什么),它并不意味着你应该承担这一点。

答案 3 :(得分:1)

不,它不安全,因为文档没有说明。这应该是安全的:

SortedSet<K> set = new TreeSet<K>(map.keySet());