Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

163
Views
Reglas de asignación extrañas de Java
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; // invalid

Por 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í?

about 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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 allowed

Y 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;
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!