eltonk:
01 public class TesteCast {
02 public static void main(String[] args) {
03 byte a = 10; //ok
04 metodoA(a); //ok
05 metodoA(10); //ERRO!!
06 }
07
08 private static void metodoA(byte b){
09 }
Bom, fiz uns testes aqui e interpretei da seguinte maneira:
Por mais que atribuir um int a um byte possa acarretar numa possível perder de precisão, um byte, no fim das contas, pode ser representado por um inteiro, e não ao contrário. Assim, o compilador analisa quais inteiros, numa atribuição de int a um byte, podem ser representados em um byte.
Ex:
public class Teste
{
public static void main( String args[] )
{
byte a = 127; // ok
byte b = 128; // erro: "possible loss of precision
}
}
No código acima, 127 pode ser representado por um byte, mas não 128.
Quanto à passagem do parâmetro, ele não permite o 10 por incompatibilidade de tipos. Na atribuição a "a", 10 foi convertido em um byte, e a é um byte. Logo, na passagem de argumentos, é byte para byte.
Contudo, ainda fica uma pergunta:
Já que ele permite isso com int -> byte, porque não permitir double -> int?
Ex:
O compilador deveria também verificar quais valores doubles poderiam ser atribuídos a um int sem perda de precisão.
Vai entender…