【问题标题】:How compile time constant will work internally in java编译时间常数如何在java内部工作
【发布时间】:2020-02-28 04:44:23
【问题描述】:

我的问题是编译时间常数在内部是如何工作的,所以我们在下面的语句中没有收到错误。

final int a = 10;
byte b = a;

以及为什么我在此语句中遇到错误。

int a = 10;
byte b = a;

【问题讨论】:

  • 同样的原因byte b = 10; 是合法的。在某些上下文中,编译器可以确定该值在byte 的有效范围内。常量就是这样。

标签: java int byte final


【解决方案1】:

这是因为并非所有整数都适合一个字节。

在您的第一个示例中,a 的值是已知的并且无法更改。编译器知道它将适合一个字节。

在你的第二个例子中,因为a 不是最终的,它可能已经被改变了(虽然不是在你的例子中)。 Java 编译器不够聪明,无法注意到没有任何改变,因此不再确定它是否适合一个字节。

举个例子,看看这个:

    final int a = 10000;
    byte b = a;

因为 a 的值现在太大而无法放入 int,它不再编译。

【讨论】:

    【解决方案2】:

    1. 对于二元运算符('=' 或 '+'...),编译器使用数值提升系统。这会在执行操作之前将“原始类型”提升为低于“int”的“原始类型”,如 byte char 并缩短为“int”。

    2.然后是 byte、char、short,接受一个常量且适合其类型大小的 int 值。

    所以下面会编译:

        final int int1 = 10;
        byte byt1 = int1; /* int to byte and when compiling to bytecode byt1 is assigned 10 and not a variable int1 as it's a final constant.*/
    

    这不会编译:

        byte byt1 = 2;
        byte byt2 = +byt1; /* int to byte but when compiling to bytecode byt1 is not assigned 2 as byt1 value might change at run time to a value larger than what byte can support so you get compiler error.*/
    

    这不会编译:

        final long lng1 = 10;
        byte byt2 = lng1; /* long type to byte. remember byte, char and short only accept int.*/
    

    【讨论】:

      【解决方案3】:

      在以下情况下,当您的 int 值不是 final 时,您必须将 int 转换为 byte,同时在 java 中为 byte 分配一个整数值。

      int a=11;
      byte b= (byte) a;
      

      【讨论】:

        猜你喜欢
        • 2017-06-05
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 2010-09-17
        相关资源
        最近更新 更多