繁体   English   中英

类型不匹配:无法使用三元运算符从int转换为字节

[英]Type mismatch: cannot convert from int to byte using ternary operator

在使用字节数组操作的项目上工作,我试图写这样的东西:

boolean enabled = getEnabled();

byte enabledByte = enabled ? 0x01 : 0x00; // compile error

我面临的问题是以上不会编译。

类型不匹配:无法从int转换为byte

但是,如果我将其扩展到以下内容,它可以正常工作:

boolean enabled = getEnabled();

byte enabledByte;
if (enabled) {

    enabledByte = 0x01;
} else {

    enabledByte = 0x00;
}

引导我回答这个问题

为什么我不能在short if语句中使用字节赋值?

数字文字自然是int类型,而不是byte

该语言具有从数字文字 (<128)到byte的特殊隐式转换,因此您的第二个示例不需要强制转换。

但是,将文字包装在条件运算符中会创建一个int类型的表达式,它不是文字的,因此您需要强制转换。

0x000x01int literals:它们是int类型的表达式。 一个int通常不能被分配给一个byte ,但它可以如果表达式编译时间常数,提供的值是在的范围byte

对于条件,赋值是编译时常量:

if (enabled) {
  enabledByte = 0x01;
} else {
  enabledByte = 0x00;
}

这些赋值与编译器的观点完全不同。 有一个语句指定常量值1,一个语句指定常量值0。

对于每个语句,编译器可以保证适合字节范围,因此它会自动将指定的值缩小为byte。

但是,使用条件运算符赋值:

enabledByte = enabled ? 0x01 : 0x00;

rhs表达式的类型为int ,但不是编译时常量,因为在编译时不知道enabled 两个可能的值都是编译时常量并不重要,两者都适合一个byte :非常量的第一个操作数使它不是常量。 因此,条件运算符表达式的结果不能自动缩小。

最有效的解决方案是将第二个和第三个操作数转换为byte

enabled ? (byte) 0x01 : (byte) 0x00

这比

(byte) (enabled ? 0x01 : 0x00)

因为后者将在运行时进行转换,所以每次计算表达式时,前者都不会:操作数在编译时已经是字节,因此不需要强制转换。

你需要至少一个强制转换才能将三元表达式翻转为一个byte ,由于三元组的原因,它默认为一个int

byte enabledByte = enabled ? (byte) 0x01 : 0x00; 

如果使用十进制文字,它的工作方式相同

byte enabledByte = enabled ? (byte) 1 : 0; 

另请参阅JLS-15.25.2 - 数字条件表达式 (部分)

否则,二进制数字提升(第5.6.2节 )将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

管理从intbyte的缩小转换的规则在语言规范, 赋值上下文部分(强调常量表达式)中指定:

此外, 如果表达式是 byteshortcharint类型的常量表达式 (第15.28节):

  • 如果变量的类型是byteshortchar ,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。

...

如果表达式的类型无法通过赋值上下文中允许的转换转换为变量的类型,则会发生编译时错误。

enabled ? 0x01 : 0x00三元条件表达式enabled ? 0x01 : 0x00 与整数文字不同, enabled ? 0x01 : 0x00不是常量表达式 因此,不能使用缩小转换来隐式转换它。

请注意,您可以通过转换条件表达式的一个操作数来解决错误:

byte enabledByte = enabled ? (byte) 0x01 : 0x00;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM