如果参数与多个方法签名匹配,则定义要调用哪种方法?

时间:2015-10-15 13:45:16

标签: java specifications

给定代码:

public static void main(String[] args)
{
    doSomething(new ArrayList());
}

public static void doSomething(Collection collection) {
    System.out.println("Collection here!");
}

public static void doSomething(List list) {
    System.out.println("List here!");
}

这会按预期打印出List here!,但这种行为是在Java规范的某处定义的,所以我可以依赖它,给定任何Java实现?

2 个答案:

答案 0 :(得分:3)

在编译时,大多数特定方法选择调用。

在你的情况下

ArrayList > List > Collection

由于ArrayListList中最具体的子类型,因此列表是Collection中最具体的子类型。

以下是方法调用规则的说明

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.2

答案 1 :(得分:0)

还有更有趣的行为:

public static void main(String[] args)
{
    Collection myCollection = new ArrayList();
    doSomething(myCollection);
}

public static void doSomething(Collection collection) {
    System.out.println("Collection here!");
}

public static void doSomething(List list) {
    System.out.println("List here!");
}

这将在此打印收藏!