java - javac 完成的任何类型转换?

标签 java casting javac

据我了解,如果可以在编译期间进行类型检查,那么类型转换将在编译期间完成,不会产生任何运行时开销。

例如

public Child getChild() {
  Parent o = new Child();
  return (Child) o;
}

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

是否有任何通用规则来决定类型转换是由 javac 编译器还是由 VM 完成的?

最佳答案

其实这种情况存在三种可能:

  1. javac 编译器可以执行优化。
  2. JIT 编译器可以执行优化。
  3. 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/

相关文章:

java - 简单的 UML 图...这个布局正确吗?

java - GXT列排序,移动蓝色三角形

java - 如何循环遍历 Map 并克隆每个值?

php - 在 php 中将派生类转换为基类

jakarta-ee - 编译错误 - Tomcat,jsp

java - 从 void 方法写入文件

java - 在Seam 2.2.2中为@RequestParameter创建bean期间捕获解析异常

c++ - 严格的别名和内存对齐

java - jetty Hello World 示例不编译

java - (JAVA) 使用命令提示符从多个 .class 文件创建 .jar 文件