キーの自然順序に従って順序付けられた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を使用し、拡張します...NavigableSetNavigableSetSortedSet
だからあなたができることは:
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()を返すメソッドがあります。NavigableSetSortedSet
ドキュメントがそれがそうなることを保証していないことを考えるとSortedSet、たとえ現在の実装がそれをそのように実装しているとしても(そして私はそれらがそうすることを確認していません)、それはあなたが想定すべきものであるという意味ではありません。
いいえ、ドキュメントには安全であると記載されていないため、安全ではありません。ただし、これは安全なはずです。
SortedSet<K> set = new TreeSet<K>(map.keySet());