Estoy escribiendo un programa con muchas enumeraciones, y tengo que devolver mucho el conjunto de claves de un EnumMap. Pero EnumMap.keySet()
devuelve una Set()
, por lo que con el fin de obtener la EnumSet
que quiero, tengo que usar un yeso:¿Por qué EnumMap <T> .keySet() devuelve un conjunto <T>() y no un EnumSet <T>()?
EnumMap<SomeEnum, Object> myMap = getMap();
EnumSet<SomeEnum> myEnum = (EnumSet<SomeEnum>) myMap.keySet();
Si no emitidos, el compilador se quejará de una coincidencia de tipos; no puede convertir de Set<SomeEnum>
a EnumSet<SomeEnum>
. Parece innecesario tener que emitir esto, ya que las claves de un EnumMap siempre serán una enumeración. ¿Alguien sabe por qué el método keySet()
se construyó de esta manera? He pensado que a veces podría tener algo que ver con que EnumSet sea una clase abstracta, pero seguramente EnumMap
podría devolver lo que sea que proporcione el método de fábrica de EnumSet
.
¡Salud, todo!
EDIT: Lo siento mucho, el código anterior arroja un CastClassException
. Puede obtener el EnumSet usando
EnumSet<SomeEnum> myEnum = EnumSet.copyOf(myMap.keySet());
Realmente debería haber comprobado antes de publicar.
Obtienes un 'Set'. ¿Cuál sería la ventaja de tener un 'EnumSet '? –
@PaulBellora Tienes razón, lo anterior está mal. Lo corregiré. Debe ser 'EnumSet myEnum = EnumSet.copyOf (myMap.keySet());' –
jalopezp
También aquí hay una bonita vista de la fuente, con estilo en línea javadoc: http://grepcode.com/file/repository.grepcode.com /java/root/jdk/openjdk/6-b14/java/util/EnumMap.java#EnumMap.keySet%28%29 –