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 esfinal
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
oint
:
- Se puede usar una conversión primitiva de estrechamiento si el tipo de la variable es
byte
,short
ochar
, 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.