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 quex
sea 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
switch
declaraciones:Esto significa que
'a'
debe ser asignable aInteger
yByte
respectivamente.Pero eso no suena bien:
Se podría pensar que ya
'a'
debería ser asignable a unInteger
porquechar
-> laint
asignación es legal. (Cualquierchar
valor encajará en unint
.)Pensaría que ya
'a'
NO debería poder asignarse a unByte
porquechar
-> labyte
asignación NO es legal. (La mayoría de loschar
valores 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 elchar
valor a unint
cuadro luegoint
aInteger
. 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'
aInteger
que no está permitido. Esto explica el error de compilación en el primer caso.Se podría pensar que
'a'
alByte
no 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'
es97
decimal, que está dentro del rango debyte
(-128
a+127
).Esto explica por qué no hay error de compilación en el segundo ejemplo.
1 - No podemos encajonar
'a'
aCharacter
ay luego ampliarCharacter
aInteger
porqueCharacter
no 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
int
como tipo de interruptor? (yachar -> int
que está permitido el ensanchamiento primitivo)