Jay*_*tel 30 java compiler-errors language-specifications
Examine the following code snippets:
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)
int a=20;
int b=30;
byte h1=70;
byte c= (a>b)? 20:h1;
Run Code Online (Sandbox Code Playgroud)
int a=20;
int b=30;
byte h1=70;
byte h2=89;
byte c= (a>b)? h1:h2;
Run Code Online (Sandbox Code Playgroud)
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文字,因此表达式的类型也为int,byte如果没有显式强制转换,则不能将其分配给变量。因此,编译错误。
片段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;是有效的。
语言规范中对此行为进行了描述。
情况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,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄的原始转换。
| 归档时间: |
|
| 查看次数: |
1295 次 |
| 最近记录: |