No compila:
void test(Integer x) {
switch (x) {
case 'a':
}
}
Compila bien:
void test(Byte x) {
switch(x) {
case 'a':
}
}
java
java-8
switch-statement
Ali GH
fuente
fuente

'a'caso se ejecutará en el caso quexsea el byte97. (Pruébelo si no me cree). Para la explicación real, vea mi respuesta.Respuestas:
Los motivos son bastante complicados, pero todos están en los detalles ( letra pequeña si lo desea) de la Especificación del lenguaje Java.
Primero, el JLS 14.11 dice lo siguiente sobre las
switchdeclaraciones:Esto significa que
'a'debe ser asignable aIntegeryByterespectivamente.Pero eso no suena bien:
Se podría pensar que ya
'a'debería ser asignable a unIntegerporquechar-> laintasignación es legal. (Cualquiercharvalor encajará en unint.)Pensaría que ya
'a'NO debería poder asignarse a unByteporquechar-> labyteasignación NO es legal. (La mayoría de loscharvalores no caben en un byte).De hecho, ninguno de estos es correcto. Para entender por qué, necesitamos leer lo que JLS 5.2 realmente trata sobre lo que está permitido en contextos de asignación.
Para ir de
'a'aInteger, necesitaríamos 1 ampliar elcharvalor a unintcuadro luegointaInteger. Pero si observa las combinaciones de conversiones permitidas, no puede hacer una conversión primitiva de ampliación seguida de una conversión de boxeo.Por lo tanto,
'a'aIntegerque no está permitido. Esto explica el error de compilación en el primer caso.Se podría pensar que
'a'alByteno está permitida ya que se incurriría una conversión de restricción primitiva ... que no está en la lista en absoluto. De hecho, los literales son un caso especial. JLS 5.2 continúa diciendo lo siguiente.El segundo de estos se aplica
'a'aByte, porque:'a'es97decimal, que está dentro del rango debyte(-128a+127).Esto explica por qué no hay error de compilación en el segundo ejemplo.
1 - No podemos encajonar
'a'aCharacteray luego ampliarCharacteraIntegerporqueCharacterno es un subtipo de JavaInteger. Solo puede usar una conversión de referencia de ampliación si el tipo de origen es un subtipo del tipo de destino.fuente
intcomo tipo de interruptor? (yachar -> intque está permitido el ensanchamiento primitivo)