10

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

也就是说,下面会抛出吗?

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

如果答案是“取决于 SortedMap 的实现”,那么对于TreeMap来说这至少是安全的吗?

4

4 回答 4

17

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

但是,TreeMap也实现NavigableMap了,它使用 aNavigableSet作为键集并NavigableSet扩展SortedSet...

所以你可以做的是:

NavigableMap<K, V> map = ...; //can be a TreeMap or a ConcurrentSkipListMap
SortedSet<K> set = map.navigableKeySet();
于 2012-09-14T15:11:33.330 回答
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()返回 a SortedSet,但 javadoc 不保证。

NavigableMapextends 接口SortedMap有一个navigableSet()方法,该方法返回一个NavigableSetextends SortedSet

于 2012-09-14T15:19:11.923 回答
4

鉴于文档不能保证它将是 a SortedSet,即使当前的实现以这种方式实现它(我还没有检查它们是否这样做),这并不意味着它是你应该假设的。

于 2012-09-14T15:09:12.040 回答
1

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

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

于 2012-09-14T15:14:35.283 回答