使用java中的final关键字从int到byte键入强制转换问题

时间:2014-07-12 20:10:51

标签: java

public static void main(String[] args) {

    final int a =15;
    byte b = a;
    System.out.println(a);
    System.out.println(b);
}

在上面的代码中,当我从int转换为byte时,它没有给出编译时错误,但是当我的转换从long转换为int时,它给出了编译时错误,为什么?

public static void main(String[] args) {

    final long a =15;
    int b = a; 
    System.out.println(a);
    System.out.println(b);
}

1 个答案:

答案 0 :(得分:11)

来自the JLS section on assignment conversions

  

此外,如果表达式是byteshortcharint类型的常量表达式:

     
      
  • 如果变量的类型是byteshortchar,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
  •   

当您声明并初始化final a那个编译时常量表达式时,编译器可以确定值15将安全地适合{{1} 1}}。 JLS根本不允许从byte隐式缩小转换,没有解释,这个规则至少可以回到Java 2(我可以在任何地方找到的最早的JLS)。

我推测这个基本原理可能源于这样一个事实,即Java字节码是针对32位字大小定义的,而long上的操作在逻辑上更加复杂和昂贵。