Solo me preguntaba cuál es / fue la razón de diseño para esto.
puedo hacer
int x = ... switch( x ) { case 1,2 -> { ... stuff ...} default -> { ... something else ...} }pero tratando de hacer algo como
Object x = ... switch( x ) { case String, Integer x -> { ... stuff ...} default -> { ... something else ...} }no compila (también probé cosas como "String x, Integer x" y "String|Integer x" pero ninguno de ellos compila).
Si entendí el JLS correctamente, simplemente no es compatible. ¿Alguien sabe por qué es así y si alguna vez se solucionará?
Después de leer JEP-420 nuevamente encontré una explicación:
Sigo pensando que esto debería ser posible si el cuerpo de la rama en realidad no se refiere a las etiquetas del caso, por ejemplo, en un código como este (ApplicationState es una clase sellada con varias subclases, tenga en cuenta que no puedo usar una enumeración aquí como algunos de los los estados necesitan contener datos mutables):
private static ApplicationState checkValidTransition(ApplicationState from, ApplicationState to ) { final boolean isValidTransition = switch(from) { case Uninitialized ignored -> to instanceof ServletContextInitializing; case Destroyed ignored -> to instanceof ServletContextInitializing; case ServletContextInitializing ignored -> to instanceof SpringContextInitializing || to instanceof Destroyed; case SpringContextInitializing ignored -> to instanceof SpringContextInitializing || to instanceof Destroyed || to instanceof WebApplicationInitFinished; case WebApplicationInitFinished ignored -> to instanceof Destroyed; }; if ( ! isValidTransition ) { throw new IllegalStateException( "Internal error, illegal state transition " + from + " -> " + to ); } return to; }