【问题标题】:Incompatible types: possible lossy conversion from int to byte不兼容的类型:从 int 到 byte 的可能有损转换
【发布时间】:2019-09-12 16:09:15
【问题描述】:

我尝试为学校编写一些代码,但我不断收到此编译错误:

错误:不兼容的类型:从 int 到 byte 的可能有损转换

A = (字节)C / (字节)B;

System.out.println("Aufgabe 4");

byte A=11; int B, C;
B = A + A;
C = B * (int)1.0;
A = (byte)C / (byte)B;

【问题讨论】:

标签: java


【解决方案1】:

原因是你没有将除法运算的整数结果转换为字节:

A = (byte) C / (byte)B; // you cast C to byte, cast B to byte and then make division

相反,只转换结果

A = (byte) (C / B);  // this is casting result to byte

【讨论】:

    【解决方案2】:

    来自 JavaSpec:

    5.6.2 二进制数字提升

    当一个运算符将二进制数字提升应用于一对 操作数,每个操作数必须表示一个数值类型的值, 以下规则依次适用,使用扩大转换(§5.1.2)到 根据需要转换操作数:

    如果任一操作数是 double 类型,则另一个将转换为 double。

    否则,如果任一操作数为浮点类型,则转换另一个 浮动。

    否则,如果任一操作数是 long 类型,则转换另一个 长。

    否则,两个操作数都转换为 int 类型。

    含义如下:(byte)C / (byte)B => 由于您没有 double、float 或 long,因此两者都转换为 int。 这使得结果为 int。而且你不能调用byteA = SomeInt;你必须先再施法。

    所以像A = (byte)(C / B); 这样的东西会更好。

    【讨论】:

      【解决方案3】:

      你的结果是一个整数。您应该转换它而不是变量:

      A = (byte) (C / B);
      

      【讨论】:

        【解决方案4】:

        在表达式中输入提升(研究这个话题)

        【讨论】:

          【解决方案5】:

          当我们尝试将大尺寸类型的变量赋值给小尺寸类型时,Java 会产生错误,不兼容的类型:可能有损转换,同时编译代码。

          当我们对小于 Integer 的原始类型进行算术运算时,Java 会自动将其转换为 Integer。对于较大的基元类型不会改变。

          byte A=11; int B, C;    //line 1
          A = (byte)C / (byte)B;  //line 2
          

          在第 2 行(上面提到的代码)中,右手边被转换为整数,因为对字节值执行除法运算。你可以试试下面提到的代码:

          Object obj = (byte)C / (byte)B;
          System.out.println(((Object)obj).getClass().getName());
          

          这将打印java.lang.Integer

          要解决它,您可以将整个结果转换为字节:

          A = (byte) (C / B);
          

          【讨论】:

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