在 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),从 int 到 byte 的转换是可能的。
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;
这里finalIntegerLO
和0xf
都是常量,编译器可以判断结果是0
,在byte范围内。
案例 5:
b = integer & 0xf;
这里 integer
的值可以在这一行执行之前改变,所以编译器不确定结果是否在 int
的范围内,所以它要求我们显式地进行类型转换像这样。
b = (byte) (integer & 0xf);
再次像 案例 3 你可能会得到意想不到的结果。
我将整数存储在字节数组中,但突然出现“所需类型:提供的字节: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),从 int 到 byte 的转换是可能的。 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;
这里finalIntegerLO
和0xf
都是常量,编译器可以判断结果是0
,在byte范围内。
案例 5:
b = integer & 0xf;
这里 integer
的值可以在这一行执行之前改变,所以编译器不确定结果是否在 int
的范围内,所以它要求我们显式地进行类型转换像这样。
b = (byte) (integer & 0xf);
再次像 案例 3 你可能会得到意想不到的结果。