Java编译器是否会优化远程转换以进行手动重载解析?

时间:2012-01-04 09:46:29

标签: 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,以便这种“手动重载解析”不会产生性能开销?或者实际的运行时执行是否仍会执行强制转换?

2 个答案:

答案 0 :(得分:4)

编译时选择该调用。因此,编译器本身选择调用哪种方法并不是一种优化。转换是为了帮助编译器,不会影响运行时性能。

这与覆盖的区别不同,在覆盖中,被调用的对象在运行时指示方法,例如

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将在每种情况下改变,以反映不同的方法)。

答案 1 :(得分:1)

您担心的性能下降到底有多大?我很好奇你的情况是什么,以至于你认为这可能有任何明显的影响,因为我一百年都不会担心这会减慢我的应用程序的速度?

实际上说:为什么不开发一个同时运行强制转换和直接调用的基准应用程序,看看你是否在几百万次迭代中有任何差异?