Sto scrivendo un programma con un sacco di enumerazioni e devo restituire molto il set di chiavi di un EnumMap. Ma EnumMap.keySet()
restituisce un Set()
, così al fine di ottenere il EnumSet
che voglio, devo usare un cast:Perché EnumMap <T> .keySet() restituisce un Set <T>() e non un EnumSet <T>()?
EnumMap<SomeEnum, Object> myMap = getMap();
EnumSet<SomeEnum> myEnum = (EnumSet<SomeEnum>) myMap.keySet();
Se non espressi, il compilatore si lamenta di un tipo non corrispondente; non può convertire da Set<SomeEnum>
a EnumSet<SomeEnum>
. Sembra inutile doverlo lanciare, poiché le chiavi di un EnumMap saranno sempre un'enumerazione. Qualcuno sa perché il metodo keySet()
è stato costruito in questo modo? Ho pensato che a volte potrebbe avere qualcosa a che fare con EnumSet essendo una classe astratta, ma sicuramente EnumMap
potrebbe semplicemente restituire qualunque sia il metodo factory di EnumSet
.
Cheers, tutto!
MODIFICA: Mi dispiace, il codice sopra riportato genera CastClassException
. È possibile ottenere l'EnumSet utilizzando
EnumSet<SomeEnum> myEnum = EnumSet.copyOf(myMap.keySet());
Avrei dovuto controllare prima di postare.
Si ottiene un 'Set'. Quale sarebbe il guadagno per avere un 'EnumSet '? –
@PaulBellora Hai ragione, quanto sopra è sbagliato. Lo correggerò. Dovrebbe essere 'EnumSet myEnum = EnumSet.copyOf (myMap.keySet());' –
jalopezp
Anche qui è una bella vista della fonte, con javadoc in linea incorporato: http://grepcode.com/file/repository.grepcode.com /java/root/jdk/openjdk/6-b14/java/util/EnumMap.java#EnumMap.keySet%28%29 –