キーの自然順序に従って順序付けられたSortedMapがあります。無効なキャスト例外のリスクを冒すことなく、keySet()をSortedSetに安全にキャストできますか?
つまり、次のスローはありますか?
SortedMap<K, V> map = ...;
SortedSet<K> set = (SortedSet<K>) map.keySet();
答えが「SortedMapの実装に依存する」である場合、これはTreeMapにとって少なくとも安全ですか?
キーの自然順序に従って順序付けられたSortedMapがあります。無効なキャスト例外のリスクを冒すことなく、keySet()をSortedSetに安全にキャストできますか?
つまり、次のスローはありますか?
SortedMap<K, V> map = ...;
SortedSet<K> set = (SortedSet<K>) map.keySet();
答えが「SortedMapの実装に依存する」である場合、これはTreeMapにとって少なくとも安全ですか?
SortedMap
一般的には、javadocに記載されていないため、いいえ。
ただし、TreeMap
を実装します。これは、キーセットとしてNavigableMap
を使用し、拡張します...NavigableSet
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()
を返しますがSortedSet
、javadocによって保証されていません。
ただし、拡張するNavigableMap
インターフェイスには、拡張SortedMap
するanavigableSet()
を返すメソッドがあります。NavigableSet
SortedSet
ドキュメントがそれがそうなることを保証していないことを考えるとSortedSet
、たとえ現在の実装がそれをそのように実装しているとしても(そして私はそれらがそうすることを確認していません)、それはあなたが想定すべきものであるという意味ではありません。
いいえ、ドキュメントには安全であると記載されていないため、安全ではありません。ただし、これは安全なはずです。
SortedSet<K> set = new TreeSet<K>(map.keySet());