【发布时间】:2011-09-03 23:25:45
【问题描述】:
我想知道为什么这个 sn-p 有效。
char ch1;
ch1 = 'a' + 1;
System.out.println(ch1);
在第 2 行中,不是将右侧提升为 int,然后将 int 分配给 char,我们不需要显式转换吗?
同样,我明白当您使用ch1 = 65 时会发生什么。但是由于Java不允许自动向下类型转换,我们不需要从int显式转换为char吗?
【问题讨论】:
我想知道为什么这个 sn-p 有效。
char ch1;
ch1 = 'a' + 1;
System.out.println(ch1);
在第 2 行中,不是将右侧提升为 int,然后将 int 分配给 char,我们不需要显式转换吗?
同样,我明白当您使用ch1 = 65 时会发生什么。但是由于Java不允许自动向下类型转换,我们不需要从int显式转换为char吗?
【问题讨论】:
因为Java Language Specification 说:
此外,如果表达式是 byte、short、char 或 int 类型的常量表达式(第 15.28 节):
如果变量的类型是 byte、short 或 char,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小原语转换。
所以你说得对,表达式被提升为int,但因为它是一个常量表达式,所以不需要强制转换。如果它涉及一个变量(或者它的值不适合 char),那就不同了。
对于此类问题,最好立即查看语言规范,因为它是权威来源,并且对于规范来说非常易读。
【讨论】:
我目前正在使用 Eclipse。有两点需要注意:
3 * (2 + 1)。这行得通:
byte b = 127; // works, range of a byte is [-128, 127]
但这不是:
byte b = 128; // does not work, outside of range
这行得通:
byte b = 100 + -228; // works, 100 + -228 = -128
但这不是:
byte b = 1;
byte c = b + 1; // does not work, why not?
这也不是:
byte b = 1;
byte c = b + (byte) 1; // does not work, why not?
注意b 是一个变量表达式。如果涉及变量表达式,则运算符 + 的结果至少与 int 一样大。因此,您不能将其分配给c。与常量表达式不同,编译器不计算变量表达式。
编译器同样会抱怨short 和char - 自己试试吧。
最后,在变量上使用final 可以有效地将其转换为常量表达式,所以这会起作用:
final byte b = 1;
byte c = b + 1; // works
【讨论】: