【发布时间】:2019-10-03 09:36:37
【问题描述】:
检查以下代码sn-ps:
片段 #1
int a=20;
int b=30;
byte c= (a>b)? 20:30;
Error:
incompatible types: possible lossy conversion from int to byte
byte c= (a>b)? 20:30;
片段 #2
int a=20;
int b=30;
byte h1=70;
byte c= (a>b)? 20:h1;
片段#3
int a=20;
int b=30;
byte h1=70;
byte h2=89;
byte c= (a>b)? h1:h2;
片段 #4
byte c= (true)? 20:30;
除了 Snippet #1 之外,所有这些都可以正常编译。这种行为如何合理?如果 Snippet #1 产生“可能的有损转换”错误,Snippets #2 和 4 也应该,因为它们仍然包含 int 类型的文字。为什么编译成功?
【问题讨论】:
-
如果将
int更改为final int(常量),编译器将看到a和b的值在-128..127 字节范围内。对于 int variables,编译器不会进行此类评估,并假定 int 可能会溢出字节范围。 -
@JoopEggen 但是为什么 a 和 b 的范围很重要,甚至它们的数据类型也很重要; (a>b) 是一个条件,将评估为真或假,并基于此将 20 或 30 分配给变量 c。我不明白为什么变量 a 和 b 的范围和类型很重要。重要的是文字 20 和 30 或变量 h1 和 h2 的范围和数据类型,我们用来分配给变量 c。但从代码 4 看来,变量 a 和 b 的数据类型和范围很重要。
-
在将较大的类型变量分配给较小的类型变量时,通常会出现警告/错误,因为信息意外丢失。但是我希望有更好的答案来阐明 java 的状态
标签: java compiler-errors language-specifications