据我了解,如果可以在编译期间进行类型检查,那么类型转换将在编译期间完成,不会产生任何运行时开销。
例如
public Child getChild() {
Parent o = new Child();
return (Child) o;
}
类型转换是在编译期间还是在运行时完成的?
是否有任何通用规则来决定类型转换是由 javac 编译器还是由 VM 完成的?
最佳答案
其实这种情况存在三种可能:
javac
编译器可以执行优化。- JIT 编译器可以执行优化。
- JIT 编译器的 native 代码可以包含执行运行时类型检查的代码。
我希望它是选项 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
}
关于java - javac 完成的任何类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11632000/