Estou me preparando para o exame OCPJP 21. Enquanto estudava autoboxing, tenho uma pergunta sobre o snippet abaixo:
class CharacterAutoboxing {
public static void main(String args[]) {
Character p = 97;
System.out.println(p);
Long l = 116L;
System.out.println(l);
// p = (int)l.longValue();
p = (char)(int)l.longValue();
System.out.println(p);
} // end of main
}
Minha consulta é Character p = 97
permitida pelo compilador. 97 é int. Então int é autoboxed em character.
Então por que p = (int)l.longValue();
não é permitido. O compilador está dando exceção, pois int não pode ser convertido para Character
Expressão constante
Se o RHS (lado direito) de uma atribuição for uma expressão constante , E o tipo for um tipo primitivo integral, E o valor estiver dentro do intervalo do tipo LHS (lado esquerdo), ENTÃO o valor do RHS pode ser atribuído ao LHS sem um cast . Autoboxing também é permitido.
A expressão
97
é uma expressão constante e está no intervalo dechar
. Como a expressão é constante, o compilador é capaz de determinar que o valor está dentro do intervalo e nenhuma conversão com perdas ocorrerá.As regras JLS relevantes estão no JLS 5.2 ... começando em "Além disso, se a expressão for uma expressão constante ..." .
Não é uma expressão constante
Porque a expressão RHS não é uma expressão constante.
Como isso não acontece, o compilador não sabe qual será o valor e, portanto, não sabe que a atribuição não pode resultar em perda de informações.
Portanto, a linguagem Java exige que você "reconheça" a conversão potencialmente com perdas usando um cast de tipo explícito para
char
. O autoboxing pode então ocorrer.Observação: o compilador está gerando um erro de compilação, não uma exceção!