给定以下代码:
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/