java scjp

Java char a byte casting



scjp (3)

He estado probando el casting de char y pasé por esto:

public class Test { public static void main(String a[]) { final byte b1 = 1; byte b2 = 1; char c = 2; c = b1; // 1- Working fine c = b2; // 2 -Compilation error } }

¿Alguien puede explicar por qué funciona bien en 1 cuando agregué una final al byte?


Bueno, es porque el byte es un tipo firmado mientras que el carácter no lo es, por lo que debe aplicar una conversión de tipo explícita para (2)

c = (char)b2;

también la declaración final funcionó para 1 porque antes de la compilación, el compilador puede confirmar que no hay pérdidas debido a la conversión, ya que ''1'' está en el rango de caracteres, intente colocar ''-1'' con la misma declaración final en ( 1) volverá a obtener un error de compilación.

Todo esto se reduce a la compatibilidad de tipos entre tipos firmados y no firmados ... lo que debe hacerse explícitamente en java.


Cuando la variable es final , el compilador alinea automáticamente su valor, que es 1. Este valor se puede representar como un char , es decir:

c = b1;

es equivalente a

c = 1;

De hecho, de acuerdo con esta sección sobre las variables final , b1 se trata como una constante:

Una variable de tipo primitivo o tipo String , que es final e inicializa con una expresión de constante de compilación (§15.28), se llama variable constante .


La conversión de byte a char es una conversión primitiva de ampliación y estrechamiento, como se describe en el párrafo 5.1.4 de la Especificación del lenguaje Java.

Como describe el JLS, esto se hace a través de un paso intermedio; el byte se convierte a int través de una conversión primitiva de ampliación y, a continuación, el int se convierte a char través de una conversión primitiva de estrechamiento (véase 5.1.3 ).

El párrafo 5.2 explica cuándo es necesario un lanzamiento cuando haces una tarea:

... si la expresión es una expresión constante ( §15.28 ) de tipo byte , short , char o int :

  • Se puede usar una conversión primitiva de estrechamiento si el tipo de la variable es byte , short o char , y el valor de la expresión constante es representable en el tipo de la variable.

Su variable b1 es de hecho una constante, pero su variable b2 no lo es, por lo que esta regla se aplica a b1 pero no a b2 .

Entonces: puede asignar b1 a c porque b1 es una constante y el valor de la constante, 1 , encaja en un char , pero no puede asignar b2 a c sin una conversión porque b2 no es una constante.