由javac完成的任何类型的转换?

qin*_*oon 9 java casting javac

根据我的理解,如果在编译期间可以进行类型检查,则类型转换将在编译期间完成,并且不会产生任何运行时开销.

例如

public Child getChild() {
  Parent o = new Child();
  return (Child) o;
}
Run Code Online (Sandbox Code Playgroud)

类型转换是在编译期间还是在运行时完成的?

是否有任何一般规则来决定是否由javac编译器或VM完成类型转换?

Ste*_*n C 2

其实,这种情况有三种可能:

  1. 编译javac器可以执行优化。
  2. JIT 编译器可以执行优化。
  3. JIT 编译器生成的本机代码可以包含执行运行时类型检查的代码。

我希望它是选项 1. 或 2.,但这可能是特定于平台的。


事实上,在我的系统上,字节码没有优化。如果要进行任何优化,将由 JIT 编译器来完成。(这符合我所听到的……大多数 Java 字节码编译器在生成字节码之前很少进行优化。)

Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public Child getChild();
  Code:
   0:   new #16; //class Child
   3:   dup
   4:   invokespecial   #18; //Method Child."<init>":()V
   7:   astore_1
   8:   aload_1
   9:   checkcast   #16; //class Child
   12:  areturn

}
Run Code Online (Sandbox Code Playgroud)