在 Java 中不一致 "Required type: byte provided: int"

Inconsistent "Required type: byte provided: int" in Java

我将整数存储在字节数组中,但突然出现“所需类型:提供的字节:int”错误,上面的一些行没有。所以我试图找出不同之处,测试如下:

    byte b;
    int integer = 12;
    final int finalInteger = 12;
    final int finalIntegerLO = 128; // 1000 0000

    b = integer;               //Required type byte provided int
    b = finalInteger;          //OK
    b = finalIntegerLO;        //Required type byte provided int

我想在 2^7 位置有一个没有“1”的最终整数可以吗?它让我知道如果将它与按位运算符结合使用会发生什么,现在对我来说意义不大了..

    b = finalIntegerLO & 0xf;  //OK

现在好了.. 但是

    b = integer & 0xf;         //Required type byte provided int

不是??

谁能解释一下为什么它的行为如此不同?

执行 b = integer 时收到的错误是“不兼容的类型:从 int 到 byte 的可能有损转换 ”。当编译器执行此语句时,从 高级数据类型 (int) 低级数据类型 (byte) 的隐式类型转换正在进行中。这是不可能的,因为这样的转换 可能 会丢失 information/precision,因此,java 试图避免它们。另一种方法是 force/coerce 使用显式类型转换的转换,如下所示:

byte b;
int integer = 12;
b = (byte) integer;

继续前进,

final int finalInteger = 12;
final int finalIntegerLO = 128;

b = finalInteger 起作用是因为 final 关键字确保变量 finalInteger 不会改变它的值。因为,我们已经告诉我们的 Java 编译器我们不能更改 finalInteger 变量的值,因为 finalInteger 存储的值是在可以存储在字节变量中的值范围内(-128 到 127),从 intbyte 的转换是可能的。 b = finalIntegerLO 不起作用,因为 finalIntegerLO 的值超过字节变量的最大值,即 -128 到 127。

让我们打破每一行


案例 1:

b = integer

在这里我们可以看到我们正在尝试将 int 转换为 byte,因此编译器会要求像这样进行显式类型转换。 (integer 的值可能超出字节范围。)

b = (byte) integer;

案例 2:

b = finalInteger;

这种情况略有不同,因为finalInteger是一个常量,其值是固定的,编译器可以预先判断它是否在字节范围内。如果它位于范围内,编译器足够聪明,可以将 int 转换为 byte,而无需我们显式对其进行类型转换。


案例 3:

b = finalIntegerLO;

字节范围是 -128 to 127 显然我们不能将 int 转换为字节并且编译器认为 finalIntegerLO 是一个常量因此不可能执行此转换并且我们看到错误

要消除此错误,我们可以显式输入大小写(不要这样做),这将用作 b = -128

b = (byte) finalIntegerLO;

案例 4:

b = finalIntegerLO & 0xf;

这里finalIntegerLO0xf都是常量,编译器可以判断结果是0,在byte范围内。


案例 5:

b = integer & 0xf;

这里 integer 的值可以在这一行执行之前改变,所以编译器不确定结果是否在 int 的范围内,所以它要求我们显式地进行类型转换像这样。

b = (byte) (integer & 0xf);

再次像 案例 3 你可能会得到意想不到的结果。