在求和变量时求和常数与显式缩小时的隐式缩小

时间:2017-01-21 14:02:52

标签: java int byte addition primitive-types

我写了一个程序。

class First
{
        public static void main(String[] args)
        {
                int c = 5;
                byte b = c+6;
                System.out.println(b);
        }
}

我的javac输出是:

error: incompatible types: possible lossy conversion from int to byte
        byte b = c+6;
                  ^
1 error

但如果我将程序修改为:

class First
{
        public static void main(String[] args)
        {
                byte b = 5+6;
                System.out.println(b);
        }
}

执行正常,输出:

11

我知道在操作之前,两个操作数都以整数转换。然后+运算符产生一个整数。但是如果变量c是一个整数,那么常量5默认也是一个整数。为什么javac在第二种情况下不会导致错误?

如果我在概念上错了,请指导我。

1 个答案:

答案 0 :(得分:3)

根据JLS的Section 5.2

  

常量表达式的编译时缩小意味着代码如:

     

字节theAnswer = 42;   被允许。如果没有缩小,整数文字42的类型为int的事实意味着需要转换为字节:

     

byte theAwerwer =(byte)42; //允许施放但不是必需的

在JLS的Section 15.28中进一步定义了常量表达式。

由于表达式5+6是一个适合byte范围的常量表达式,因此它将在编译时自动缩小,而无需显式强制转换。另一方面,由于表达式c+6不是常量表达式,因此它不会自动缩小,并且需要显式强制转换。