换句话说,Java编译器如何确定选择执行哪个重载方法的准确规则是什么?我花了很多时间用Google搜索,我认为我没有使用正确的搜索关键字。
public class C1 extends C2 {}
public class C2 extends C3 {}
public class C3 {}
public class Test {
public static void main(String[] args) {
C1 c1 = new C1();
// What are the precise rules for determining
// which method below is called?
method(c1, c1);
}
static public void method(C3 test, C3 test2) {
System.out.println("C3");
}
static public void method(C2 test, C3 test2) {
System.out.println("C2");
}
}
答案 0 :(得分:1)
JLS的相关部分是15.12.2 Compile-Time Step 2: Determine Method Signature。规则是复杂和技术性的,但一般原则是选择具有最具体参数类型的适用方法。
答案 1 :(得分:0)
我认为这在Java Language Spec, Conversions.
中有说明我可以从那里看到,必须是一个扩大的参考转换,但我没有看到关于路径的任何评论。在我看来,它搜索最短的匹配路径(在继承树中),因为这是最符合逻辑的,但同样,我在规范中找不到。