2012-09-14 1 views
7

私はSortedMapを持っています。そのキーの自然な順序に従って並べられています。無効なキャスト例外を発生させることなく、keySet()をSortedSetに安全にキャストできますか?SortedMapのkeySet()は常に安全にSortedSetにキャストできますか?

つまり、次のようにスローされますか?

SortedMap<K, V> map = ...; 
SortedSet<K> set = (SortedSet<K>) map.keySet(); 

答えは「のSortedMapの実装に依存」である場合、これはTreeMapのための安全な最低限のですか?ドキュメントは、それが現在の実装がそのように実装した場合でも、SortedSetになることを保証するものではないことを考えると

+0

「ドキュメントで保証されていない」と書いている人は、SortedSetのkeySet()のドキュメントに「セットのイテレータがキーを昇順で返す」と述べています。したがって、 "SortedSet"ではないにもかかわらず、ソートされたセットです。 –

+1

実際には** ** SortedSetです。しかし理論的には、指定されていない限り、必ずしもそうである必要はありません(例えば、内部キーセットではない新しいソートセットが反復のために作成される可能性があります - 確かにこれは愚かです)。 – assylias

+0

修正:実際には、答えの1つが指摘しているソートセットであるとは限りません。 – assylias

答えて

12

SortedMapの場合は、javadocには記載されていません。

しかし、TreeMapもキーセットとしてNavigableSetを使用していますNavigableMap、およびNavigableSetを実装して... SortedSet拡張

だから、あなたが何ができるかです:いいえ、それはので、安全ではないん

NavigableMap<K, V> map = ...; //can be a TreeMap or a ConcurrentSkipListMap 
SortedSet<K> set = map.navigableKeySet(); 
4

(と私は、彼らが行うことをチェックしていない)、それは何か、あなただという意味ではありません仮定する必要があります。

1

をドキュメンテーションはそれを言っていない。しかしこれは安全ではないはずです。

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

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); 

だから、答えはNOです。

TreeMap.keySet()SortedSetを返しますが、javadocでは保証されません。 SortedMapを拡張

NavigableMapインターフェースは、しかし、SortedSetを拡張NavigableSetをreturs navigableSet()方法を有しています。

+1

+1のカウンタ例! – assylias

関連する問題