记录重载方法的首选参数转换(如果有的话)?

时间:2010-02-18 07:55:33

标签: java compiler-construction arguments overloading

换句话说,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");
    }

}

2 个答案:

答案 0 :(得分:1)

JLS的相关部分是15.12.2 Compile-Time Step 2: Determine Method Signature。规则是复杂和技术性的,但一般原则是选择具有最具体参数类型的适用方法。

答案 1 :(得分:0)

我认为这在Java Language Spec, Conversions.

中有说明

我可以从那里看到,必须是一个扩大的参考转换,但我没有看到关于路径的任何评论。在我看来,它搜索最短的匹配路径(在继承树中),因为这是最符合逻辑的,但同样,我在规范中找不到。