下面的变量(称为b)可以称为表达式吗?如果它是位于等号右侧的唯一东西?
// This code fragment will not compile.
// c is a char, and b is a byte.
c = b;
我之所以问这个问题,是因为表达式中的类型提升主题。 我知道Java将所有字节提升为整数。 这是此代码片段无法编译的唯一原因吗? (请注意,我知道演员表;这不是这个线程的重点。 多谢。
编辑:非常感谢乔恩和彼得。 使用第二个示例查看本主题:
byte b = 1;
short s = 2;
s = b; // OK
s = b*2; // Not OK (compilation error)
以下情况是否属实?
(第 3 行)Java 将字节转换为短字节。(第 4 行)Java 将表达式 b*2 转换为 int。
如果这是正确的,那么 =b; 和 =b*2; 似乎是 Java 以不同方式处理的"表达式"。 所以,=b;"表达式"不是转换为整数,而是加宽为短。 但是 =b*2;表达式被转换为 int,而不是短整型,即使名为 s 的目标变量是短变量。
编辑 2:也-
short s1, s2 = 2, s3 = 2;
s1 = s2*s3; // Not OK (compilation error)
即使所有三个变量都是短变量,s2*s3; 表达式也会提升为 int,从而导致编译错误。
试试这个
byte b = -1;
short s = b; // is ok as a byte can be promoted to an short.
int i = b; // is ok as a byte can be promoted to an int.
float f = b; // is ok as a byte can be promoted to an float, long or double.
char c = b; // won't compile
但
final byte b = 1;
char c = b; // compiles fine as the compiler can inline the value.
在这种情况下
short s = b*2; // Not OK (compilation error)
b * 2 是一个int
,因为2
是一个int
值。 如果b
是最终的,您将能够这样做,因为编译可以内联值。
下面的变量(称为 b)可以称为表达式吗,如果它是位于等号右侧的唯一东西?
是的,绝对。
我知道Java将所有字节提升为整数。
好吧,在某些情况下。并非在所有情况下。
从根本上说,代码无法编译,因为没有从byte
到char
的隐式转换。从 JLS 的第 5.1.2 节(扩大基元转换):
基元类型的 19 种特定转换称为扩大基元转换:
byte
short
、int
、long
、float
或double
- 。
请注意,目标类型列表中缺少char
byte
转化的目标类型列表中缺少。