Saltar al contenido

Error de tiempo de compilación “posible conversión con pérdida de int a byte” inconsistente

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 intque 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 bytepor lo que el tipo de expresión es byteque 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 bytepor lo que el tipo de expresión es byteque 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *