java - Java 编译器是否会针对手动重载决议优化远离类型转换?

标签 java optimization compiler-construction overloading

给定以下代码:

class C {
   static void m(String s) { ... } // 1
   static void m(Object o) { ... } // 2

   public static void main(String[] args) {
      m( (Object) "test"); // call m version 2
   }
}

Java 编译器是否会优化对 Object i main 的转换,以便这种“手动重载解析”不会产生性能开销?或者实际的运行时执行是否仍会执行转换?

最佳答案

该调用是在编译 时选择的。所以这不是优化,而是编译器本身选择调用哪个方法。强制转换是为了帮助编译器,不会影响运行时性能。

这与重写不同,在重写中被调用的对象在运行时指示方法,例如

shape.getArea(); // determined by whether shape is a square, circle etc.

如果您使用/不使用转换来编写上面的代码并生成字节码 (javap -verbose -c C),您将在生成的代码中看到这种差异:

<    2: invokestatic    #7; //Method m:(Ljava/lang/Object;)V
---
>    2: invokestatic    #7; //Method m:(Ljava/lang/String;)V

即编译器只是选择了不同的方法(const #7 将在每种情况下发生变化以反射(reflect)不同的方法)。

关于java - Java 编译器是否会针对手动重载决议优化远离类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8724792/

相关文章:

java - 在给定整数的叉积中生成一行

java - 未关闭的流是否会导致 java 中的内存泄漏?

java - 无需物理设备即可检查 Android 应用程序的速度?

algorithm - 说明 token 流上的最左边的推导

c - gcc C 编译器是用 C 本身编写的吗?

java - 并发问题 - 从 Java 多线程服务器下载的同一文件的大小不同

Java HTTP 发布原始数据

c++ - 在现代 x86 硬件上编写比特流的最快方法

algorithm - 每对等长集的最大基数交集

compiler-construction - GLR解析算法资源