【问题标题】:Type cast issue from int to byte using final keyword in java在java中使用final关键字将类型转换问题从int转换为byte
【发布时间】:2014-07-12 20:10:50
【问题描述】:
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);
}

【问题讨论】:

  • 这只是架构上的另一个缺陷。有许多。少数有“原因”——大多数没有。

标签: java


【解决方案1】:

来自the JLS section on assignment conversions

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

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

当您声明和初始化 final a 时,这是一个编译时常量表达式,编译器可以确定值 15 将安全地适合 byte。 JLS 根本不允许从 long 进行隐式缩小转换,无需解释,这条规则至少可以追溯到 Java 2(我能在任何地方找到的最早的 JLS)。

我推测这个基本原理可能源于 Java 字节码是为 32 位字长定义的,而对 long 的操作在逻辑上更复杂且成本更高。

【讨论】:

    猜你喜欢
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2020-10-09
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多