我有一个SortedMap,根据其键的自然顺序排序。我可以安全地将其 keySet() 转换为SortedSet,而不会冒无效转换异常的风险。
也就是说,下面会抛出吗?
SortedMap<K, V> map = ...;
SortedSet<K> set = (SortedSet<K>) map.keySet();
如果答案是“取决于 SortedMap 的实现”,那么对于TreeMap来说这至少是安全的吗?
一般来说,没有,因为SortedMap
它没有记录在 javadoc 中。
但是,TreeMap
也实现NavigableMap
了,它使用 aNavigableSet
作为键集并NavigableSet
扩展SortedSet
...
所以你可以做的是:
NavigableMap<K, V> map = ...; //can be a TreeMap or a ConcurrentSkipListMap
SortedSet<K> set = map.navigableKeySet();
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 不保证。
NavigableMap
extends 接口SortedMap
有一个navigableSet()
方法,该方法返回一个NavigableSet
extends SortedSet
。
鉴于文档不能保证它将是 a SortedSet
,即使当前的实现以这种方式实现它(我还没有检查它们是否这样做),这并不意味着它是你应该假设的。
不,它不安全,因为文档没有说它是安全的。这应该是安全的:
SortedSet<K> set = new TreeSet<K>(map.keySet());