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;

finalIntegerLO0xf都是常量,编译器可以确定0在字节范围内的结果。


情况5:

b = integer & 0xf;

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

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

再次遇到案例3 ,您可能会得到意外的结果。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...