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を使用し、拡張します...NavigableSetNavigableSetSortedSet

だからあなたができることは:

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()を返しますがSortedSet、javadocによって保証されていません。

ただし、拡張するNavigableMapインターフェイスには、拡張SortedMapするanavigableSet()を返すメソッドがあります。NavigableSetSortedSet

于 2012-09-14T15:19:11.923 に答える
4

ドキュメントがそれがそうなることを保証していないことを考えるとSortedSet、たとえ現在の実装がそれをそのように実装しているとしても(そして私はそれらがそうすることを確認していません)、それはあなたが想定すべきものであるという意味ではありません。

于 2012-09-14T15:09:12.040 に答える
1

いいえ、ドキュメントには安全であると記載されていないため、安全ではありません。ただし、これは安全なはずです。

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

于 2012-09-14T15:14:35.283 に答える