Alejandro, miembro de nuestro equipo de trabajo, nos ha hecho el favor de escribir esta reseña porque domina perfectamente dicho tema.
Solución:
JLS 15.25. explica este comportamiento.
Fragmento #1:
Si el segundo y tercer operandos tienen el mismo tipo (que puede ser el null tipo), entonces ese es el tipo de la expresión condicional
Tanto el segundo como el tercer operando son int
literales, por lo que el tipo de expresión también es int
que no se puede asignar a un byte
variable sin conversión explícita. De ahí el error de compilación.
Fragmento #2:
Si uno de los operandos es de tipo T donde T es byte, short o char, y el otro operando es una expresión constante (§15.28) de tipo int cuyo valor es representable en tipo T, entonces el tipo de la expresión condicional es t
Un operando es un byte
y el otro es un int
literal cuyo valor se puede representar como byte
por lo que el tipo de expresión es byte
que se puede asignar a un byte
variable.
Fragmento #3:
Si el segundo y tercer operandos tienen el mismo tipo (que puede ser el null tipo), entonces ese es el tipo de la expresión condicional
Tanto el segundo como el tercer operando son byte
por lo que el tipo de expresión es byte
que se puede asignar a un byte
variable.
Fragmento #4:
Dado que los 3 operandos son constantes, la expresión ternaria completa es una expresión constante, por lo que el compilador trata esta expresión como una asignación simple: byte c = 20;
– que es válido.
Este comportamiento se describe en la especificación de idioma.
Los casos 1 y 3 se describen en el mismo punto:
Si los operandos segundo y tercero tienen el mismo tipo, entonces ese es el tipo de la expresión condicional.
En el caso 1, los operandos son de tipo int, por lo que la expresión general es de tipo int, por lo que es incompatible. En el caso 3, los operandos de de tipo byte, por lo que el resultado es compatible.
El caso 2 me sorprende: hubiera esperado que eso también fallara, porque el operando int haría que la expresión condicional fuera de tipo int.
Sin embargo, este comportamiento se describe en el siguiente punto:
Si uno de los operandos es de tipo T donde Ti es byte, short o char, y el otro operando es una expresión constante (§15.28) de tipo int cuyo valor es representable en tipo T, entonces el tipo de la expresión condicional es T .
El 20 es una expresión constante que cabe en un byte, por lo que el resultado es un byte.
El caso 4 también se describe mediante la “regla de operandos del mismo tipo” utilizada para los casos 1 y 3; sin embargo, el hecho de que la condición ahora sea constante la convierte en una expresión constante.
Una expresión constante de tipo int se reduce implícitamente cuando se asigna a una variable de tipo más estrecho, como se describe en Contextos de asignación:
Se puede usar una conversión primitiva de restricción si la variable es de tipo byte, short o char, y el valor de la expresión constante se puede representar en el tipo de la variable.
Reseñas y calificaciones del artículo
Si piensas que te ha sido de ayuda este artículo, sería de mucha ayuda si lo compartes con el resto desarrolladores de este modo contrubuyes a dar difusión a nuestra información.