Java 不兼容类型:将参数传递给函数时,可能会发生从int到byte的有损转换

Java 不兼容类型:将参数传递给函数时,可能会发生从int到byte的有损转换,java,Java,我一直在用java编写一个程序。如果我将一个整数赋给一个字节变量,它将正确编译,如下所示: 字节测试=1 但是如果我将相同的整数传递给一个使用字节的方法参数,我会得到错误不兼容的类型:从int到byte的可能有损转换 double result=myClass.subtractnumber(1,2,3) 公共双减法数字(字节a1、整数a2、整数a3) 我的问题是为什么编译器在第一种情况下不显示错误,而在第二种情况下显示错误?以下是完整的代码: public class MyClass {

我一直在用java编写一个程序。如果我将一个整数赋给一个字节变量,它将正确编译,如下所示:

字节测试=1

但是如果我将相同的整数传递给一个使用字节的方法参数,我会得到错误不兼容的类型:从int到byte的可能有损转换

double result=myClass.subtractnumber(1,2,3)

公共双减法数字(字节a1、整数a2、整数a3)

我的问题是为什么编译器在第一种情况下不显示错误,而在第二种情况下显示错误?以下是完整的代码:

 public class MyClass {
        public static void main(String args[]) {
            MyClass myClass = new MyClass();
            byte test = 1; // this line does not show any errors
            double result = myClass.subtractNumbers(1,2,3);  // But this call shows error
            System.out.println("function result : " + result);
        }
        public double subtractNumbers(byte a1, int a2, int a3){
            double sum = a1 + a2 + a3;
            return sum;
        }
    }

当您指定数值文字时,该文字的值在编译时已知。如果该值在字节范围内,编译器允许该赋值。类似地,此语句将给出编译错误

byte test = 1000;
不兼容类型:从int到byte的可能有损转换

对于第二种情况,根据方法签名,该方法采用类型为的参数。现在方法不知道将用什么值调用它。因此,当您调用传递整数值的方法时,它无法保证值位于字节范围内。所以编译器直接抛出一个错误

假设编译器确实允许该方法调用,那么这种情况就会发生

int a1 = 5; int a2 = 8; int a3 = 10;
subtractNumbers(a1, a2, a3); // this would have been OK
a1 = 1000;
subtractNumbers(a1, a2, a3); // this would not have been OK

由于这种模糊性,编译器抛出错误。

字节测试=1是例外。这是允许的,因为值1适合字节range@ernest_k这是一个编译时常量表达式。@AndyTurner您能提供更多解释吗?或者给我指一些教程?我在谷歌上搜索了这个错误,但没有得到太多帮助。@Rumel可以找到,“此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28):…”。这是一种不常见的情况(因为它只发生在编译时常量积分变量的赋值中),所以我可以想象很多教程都跳过了它。@AndyTurner。谢谢你给我提供的教程。我正在读这个。