我有一个SortedMap,根据其键的自然顺序排序。我可以安全地将其keySet()强制转换为SortedSet,而不会冒无效的强制转换异常。
那就是,下面会抛出吗?
SortedMap<K, V> map = ...;
SortedSet<K> set = (SortedSet<K>) map.keySet();
如果答案是“取决于SortedMap的实施”,这对于TreeMap至少是安全的吗?
答案 0 :(得分:15)
对于SortedMap
一般来说,不是,因为它没有记录在javadoc中。
但是,TreeMap
也会实现NavigableMap
,NavigableSet
使用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());