如何解决Java中不一致的“必需类型:提供的字节:int”
我将整数存储在字节数组中,但是突然我收到“必需类型:提供的字节: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 =整数时收到的错误是“ 不兼容的类型:可能从int到字节的有损转换”。当编译器正在执行此语句时,正在执行从较高数据类型(int)到较低数据类型(byte)的隐式类型转换。这是不可能的,因为在这种转换中可能会丢失信息/精度,因此java尝试避免这种情况。一种替代方法是使用显式类型转换来强制/强制转换,如下所示:
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
在字节范围内的结果。
情况5:
b = integer & 0xf;
在执行此行之前,可以更改integer
的值,因此编译器不确定结果是否在int
的范围内,因此它要求我们像这样显式地进行类型转换。
b = (byte) (integer & 0xf);
再次遇到案例3 ,您可能会得到意外的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。