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

Sha*_*wal 7 java

public static void main(String[] args) {

    final int a =15;
    byte b = a;
    System.out.println(a);
    System.out.println(b);
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当我从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);
}
Run Code Online (Sandbox Code Playgroud)

chr*_*ke- 11

分配转换的JLS部分:

此外,如果表达式的类型是恒定表达byte,short,char,或int:

  • 如果变量的类型是byte,, short或者char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.

当您声明并初始化时final a,这是一个编译时常量表达式,编译器可以确定该值15将安全地适合于byte.JLS根本不允许在long没有解释的情况下隐式缩小转换,并且此规则至少回溯到Java 2(我可以在任何地方找到的最早的JLS).

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