error en tiempo de compilación incompatibles "con pérdida posible conversión de int a byte"

Jay Patel:

Examinar los siguientes fragmentos de código:

Fragmento # 1

int a=20;
int b=30;
byte c= (a>b)? 20:30;
Error:
incompatible types: possible lossy conversion from int to byte
byte c= (a>b)? 20:30;

Fragmento # 2

int a=20;
int b=30;
byte h1=70;
byte c= (a>b)? 20:h1;

Fragmento # 3

int a=20;
int b=30;
byte h1=70;
byte h2=89;
byte c= (a>b)? h1:h2;

Fragmento # 4

byte c= (true)? 20:30;

Todos estos fina de compilación a excepción de fragmentos # 1. ¿Cómo se justifica este comportamiento? Si Fragmento # 1 produce el error "posible conversión con pérdida", Fragmentos # 2 y 4 también deberían, dado que todavía contienen literales de tipo int. ¿Por qué se compilan con éxito?

Eran :

JLS 15.25. explica este comportamiento.

Fragmento # 1:

Si el segundo y tercer operandos tienen el mismo tipo (que puede ser del tipo null), a continuación, que es el tipo de la expresión condicional

Tanto el segundo y tercer operandos son intliterales, por lo que el tipo de la expresión es también int, que no puede ser asignado a una bytevariable 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 el tipo T, entonces el tipo de la expresión condicional es T.

Un operando es una bytey la otra es un intliteral cuyo valor puede ser representado como byte, por lo que el tipo de la expresión es byte, que puede ser asignado a una bytevariable.

Fragmento # 3:

Si el segundo y tercer operandos tienen el mismo tipo (que puede ser del tipo null), a continuación, que es el tipo de la expresión condicional

Tanto el segundo y tercer operandos son byte, por lo que el tipo de la expresión es byte, que puede ser asignado a una bytevariable.

Fragmento # 4:

Desde los 3 operandos son constantes, toda la expresión ternaria es una expresión constante, por lo que los compilador trata esta expresión como una simple asignación de - byte c = 20;- el cual es válido.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=227284&siteId=1
Recomendado
Clasificación