【问题标题】:incompatible types: possible lossy conversion from int to byte while passing argument to function不兼容的类型:在将参数传递给函数时可能有损从 int 到 byte 的转换
【发布时间】:2018-08-25 07:25:09
【问题描述】:

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

byte test = 1;

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

double result = myClass.subtractNumbers(1,2,3);

public double subtractNumbers(byte a1, int a2, int 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 = 1; 是个例外。这是允许的,因为值 1 适合字节范围
  • @ernest_k 它是一个编译时常量表达式。
  • @AndyTurner 你能提供更多解释吗?或者指点我任何教程?我用谷歌搜索了这个错误,但没有得到太多帮助。
  • @Rumel 可以找到 in the language spec,“此外,如果表达式是 byte、short、char 或 int 类型的常量表达式(第 15.28 节):...”。这是一种不常见的事情(因为它只发生在编译时常量整数变量的赋值中),所以我可以想象很多教程都会跳过它。
  • @AndyTurner。感谢您为我提供教程。我正在读这个。

标签: java


【解决方案1】:

当您分配数字文字时,该文字的值在编译时是已知的。如果该值在字节范围内,编译器允许该赋值。同样,这条语句也会报编译错误。

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

由于这种歧义,编译器会抛出错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多