当前位置: 首页 > 知识库问答 >
问题:

缩窄基元转换过程中的Java编译器行为

裴理
2023-03-14

在我看来,这种解释是不正确的。这两行代码相同吗?

事实上

byte b = 27;

只是一个常数。而常数的编译时缩小是这段代码有效的唯一原因。所以不需要铸造。当缩小范围时,编译器只检查指定的值是否适合变量的类型。规范规定:

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

byte b = (byte) 27;
byte b = 5.0; // compile error
byte b = 277777777; // compile error
byte b = (byte) 5.0; // valid!
byte b = (byte) 277777777; // valid!!

共有1个答案

邵博艺
2023-03-14

很容易测试出来。将以下内容放在temp.java中:

class Temp {
  public static void main(String[] argv) {
    byte b = 27;
    System.out.println(b);
  }
}

现在用您喜欢的编译器编译它:

$ javac Temp.java

现在用Javap转储字节码:

 $ javap -c Temp.class
 Compiled from "Temp.java"
  class Temp {
    Temp();                                                                                                                             
      Code:
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return

    public static void main(java.lang.String[]);                                                                                        
      Code:
         0: bipush        27
         2: istore_1
         3: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;                                       
         6: iload_1
         7: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        10: return
  }
 类似资料:
  • (译注:“窄转换”是我见到过的一个翻译术语,但我忘记是在那本书上看到的。此处也可译为“预防类型截断”或者“预防类型切割”。) 问题现象:C和C++会进行隐式的(类型)截断 int x = 7.3; // 啊哦! void f(int); f(7.3); // 啊哦! 但是,在C++11中,使用{}进行初始化不会发生这种窄转换(译注:也就是使用{}对变量进行初始化时,不会进行隐

  • 问题内容: Java编译器(即javac)在生成字节码时不会执行任何优化。是真的吗 如果是这样,那么它可以实现为中间代码生成器以消除冗余并生成最佳代码吗? 问题答案: 如果有的话,只会做很少的优化。 关键是JIT编译器完成了大部分优化工作-如果它具有很多信息,则效果最佳,如果执行优化,其中的一些信息也可能会丢失。如果执行某种形式的循环展开,那么JIT很难以一般的方式自行完成-而且,由于它了解目标平

  • 我想在将源代码传递给编译器之前,在编译时转换java源代码。换句话说,我想创建一个能够转换的预处理器 转换为任何其他代码,如: null 我很乐意为这两种方法找到一个java代码预处理的简单示例。 有没有人认为有什么聪明的方法来进行代码转换,而不是用多个ivy模块完全改变现有的大型代码库?注释似乎是最好的方法,但我不明白该怎么做。

  • 我很难理解为什么一维数组到基元数组的转换失败,而二维情况下却有效。 我试着翻阅文件,但没有用。我可以看到的一件事是,在第一种情况下,由于我们试图将转换为,所以可能导致错误,而第二种情况可以正常工作,因为将是一个对象类型。 用一个示例来解释的工作原理,特别是对基元的工作原理,将非常有帮助。

  • 问题内容: 是否有一种优雅的方法将原语数组转换为相应容器对象的数组- 例如,将a 转换为a ?还是我坚持循环浏览并手动执行? 是的,循环并不完全困难。有点丑。 问题答案: Apache Commons Apache Commons / Lang 有一个ArrayUtils类,用于定义这些方法。 所有称为 从原始数组转换为包装器数组的方法 从包装对象数组到原始数组的所有转换 例: 番石榴 但是然后我