Inconsistent "possible lossy conversion from int to byte" compile-time error

Jay*_*tel 30 java compiler-errors language-specifications

Examine the following code snippets:

Snippet #1

int a=20;
int b=30;
byte c= (a>b)? 20:30;
Run Code Online (Sandbox Code Playgroud)
Error:
incompatible types: possible lossy conversion from int to byte
byte c= (a>b)? 20:30;
Run Code Online (Sandbox Code Playgroud)

Snippet #2

int a=20;
int b=30;
byte h1=70;
byte c= (a>b)? 20:h1;
Run Code Online (Sandbox Code Playgroud)

Snippet #3

int a=20;
int b=30;
byte h1=70;
byte h2=89;
byte c= (a>b)? h1:h2;
Run Code Online (Sandbox Code Playgroud)

Snippet #4

byte c= (true)? 20:30;
Run Code Online (Sandbox Code Playgroud)

All of these compile fine except for Snippet #1. How is this behavior justified? If Snippet #1 produces the "possible lossy conversion" error, Snippets #2 and 4 should also, given that they still contain literals of type int. Why do they compile successfully?

Era*_*ran 30

JLS 15.25。解释此行为。

片段1:

如果第二个和第三个操作数具有相同的类型(可能为null类型),则这是条件表达式的类型

第二个操作数和第三个操作数都是int文字,因此表达式的类型也为intbyte如果没有显式强制转换,则不能将其分配给变量。因此,编译错误。

片段2:

如果其中一个操作数的类型为T,其中T为byte,short或char,而另一个操作数为int类型的常量表达式(第15.28节),其值可在类型T中表示,则条件表达式的类型为T.

一个操作数是a byte,另一个是int文字,其值可以表示为byte,因此表达式的类型为byte,可以将其分配给byte变量。

片段3:

如果第二个和第三个操作数具有相同的类型(可能为null类型),则这是条件表达式的类型

第二和第三操作数均为byte,因此表达式的类型为byte,可以将其分配给byte变量。

片段4:

由于所有3个操作数都是常量,因此整个三元表达式都是常量表达式,因此编译器将此表达式视为简单的赋值- byte c = 20;是有效的。


And*_*ner 8

语言规范中对此行为进行了描述。


情况1和3的描述相同:

如果第二个操作数和第三个操作数具有相同的类型,那么这就是条件表达式的类型。

在情况1中,操作数的类型为int,因此整个表达式的类型为int,因此不兼容。在情况3中,字节类型的操作数,因此结果是兼容的。


情况2对我来说是令人惊讶的:我本来希望它也会失败,因为int操作数将导致条件表达式为int类型。

但是,在以下几点中描述了此行为:

如果一个操作数的类型为T,其中Tis byte,short或char,而另一个操作数为int类型的常量表达式(第15.28节),其值可在类型T中表示,则条件表达式的类型为T 。

20是一个适合字节的常数表达式,因此结果是一个字节。


情况4也由用于情况1和3的“相同类型的操作数”描述;但是,条件现在是常量这一事实使它成为常量表达式

赋值上下文中所述,将int类型的常量表达式分配给较窄类型的变量时会隐式缩小其范围

如果变量的类型为byte,short或char,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄的原始转换。