short s = 'a'; // valid Short ss = 'a'; // valid int i = 'a'; // valid Integer ii = 'a'; // invalid¿Por qué Integer ii = 'a' no es válido, pero int i = 'a' es válido? ¿Por qué Short ss = 'a' es válido, pero Integer ii = 'a' no es válido?
otra pregunta fija:
byte b; final short s = 1; final Short ss = 1; final int i =1; final Integer ii = i; final long L = 1; final Long LL =1L; b = s; // valid b = ss; // invalid b = i; // valid b = ii; // invalid b = L; // invalid b = LL; // invalidPor qué b = L; inválido, mientras que b = s; válido ?
Por favor, no digas que es todo porque JLS lo dijo. Quiero saber por qué JLS tiene estas reglas inconsistentes y no intuitivas. ¿Qué me perdí?
Entonces, la línea:
Short s = 'a'; // is valid ...Debido a que char es un valor de 16 bits sin signo (el valor máximo es 65 536) y short es un valor de 16 bits con signo (el valor máximo es 32 767), hay una conversión primitiva de estrechamiento (char a short) seguida de una conversión boxing (short a Short ).
short s = 'a'; // is valid - this is a narrowing primitive conversion (char -> short)Estos son casos especiales :
Además, si la expresión es una expresión constante de tipo byte , short , char o int :
- Se puede usar una conversión primitiva de restricción si el tipo de variable es byte , short o char , y el valor de la expresión constante se puede representar en el tipo de variable.
Se puede utilizar una conversión primitiva de estrechamiento seguida de una conversión boxing si el tipo de variable es:
Byte y el valor de la expresión constante es representable en el tipo byte .
Short y el valor de la expresión constante es representable en el tipo short .
El carácter y el valor de la expresión constante se pueden representar en el tipo char .
Vamos a los siguientes ejemplos:
Integer ii = 'a'; // is invalid - not a special case according to Oracle docs int i = 'a'; // is valid - widening primitive conversion (char -> int) is allowedY un caso más de tu pregunta:
byte b; final long L = 1; b = L // error - incompatible types¿Por qué la línea b = L no es válida? Debido a que no es un caso especial descrito anteriormente y podemos perder información durante un lanzamiento, es por eso que debe realizarlo explícitamente:
b = (byte) L; // is valid - narrowing primitive conversion (long -> byte)Además, eche un vistazo a una tabla muy útil.
Hay mucha información sobre todas estas reglas en la documentación de JLS y no necesita preocuparse por todas ellas. Lo que puedo decir sobre su última pregunta es que sin una conversión de restricción implícita, cualquier literal entero requeriría una conversión en los siguientes casos:
// Cast is permitted, but not required - profit! byte b = (byte) 100; short s = (short) 100;Gracias a eso podemos cambiarlo a:
byte b = 100; short s = 100;