2012-09-14 6 views
7

Tengo un SortedMap, ordenado de acuerdo con el orden natural de sus claves. ¿Puedo lanzar con seguridad su keySet() a un SortedSet, sin arriesgar una excepción de conversión no válida.¿Puede keySet() de SortedMap ser lanzado de manera segura a SortedSet?

Es decir, ¿arrojará el siguiente?

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

Si la respuesta es "depende de la implementación de SortedMap", es esto en un mínimo de seguridad para un TreeMap?

+0

Para todos los que escriban "no garantizados en la documentación", permítanme señalar que la documentación para el conjunto de claves SortedSet() dice "El iterador del conjunto devuelve las claves en orden ascendente". Entonces, aunque no es un "SortedSet", es un conjunto ordenado ... –

+1

En la práctica, ** es ** un SortedSet. Pero, en teoría, mientras no se especifique, no tiene por qué (por ejemplo, se podría crear un nuevo SortedSet que no sea el conjunto de claves internas para la iteración; es cierto que esto sería estúpido). – assylias

+0

Corrección: incluso en la práctica, no siempre es un Sortedset como se señala en una de las respuestas. – assylias

Respuesta

12

Para SortedMap en general, no, ya que no está documentado en el javadoc.

Sin embargo, también se implementa TreeMapNavigableMap, que utiliza un NavigableSet como un juego de llaves y se extiende NavigableSet ... SortedSet

Entonces, ¿qué se puede hacer es:

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

Teniendo en cuenta que la documentación no garantiza que será un SortedSet, aunque las implementaciones actuales implementar esa manera (y no he comprobado que lo hacen), no significa que sea algo que se debería asumir.

1

No, no es seguro ya que la la documentación no dice que es. Esto debe ser seguro sin embargo:

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

Así que la respuesta es no.

TreeMap.keySet() devuelve SortedSet, pero no está garantizado por el javadoc.

La interfaz NavigableMap, que se extiende SortedMap, tiene un método navigableSet(), que returs un NavigableSet, que se extiende SortedSet, sin embargo.

+1

+1 para el contra-ejemplo! – assylias

Cuestiones relacionadas