java varargs方法表现不同

时间:2012-01-27 22:51:52

标签: java variadic-functions

鉴于以下代码:

public class Main {
    public static void main(String[] args) {
        new CC().ff(1);
    }
}

class CC {
    public static void ff(int cc) {
        System.out.println("bbbbb");
    }

    public static void ff(int... ints) {
        System.out.println("aaaaaaa");
    }
}

输出将是:

aaaaaaa

bbbbb

如果我将第三行更改为CC.ff(1),则输出为:

bbbbb

有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:2)

如果我读到我认为的relevant section of the JLS权利(它不是完全轻便的睡前读数),那么查找哪个方法调用调用哪个方法在三个阶段中按顺序搜索以下几组方法:

  1. Matching Arity Methods Applicable by Subtyping
  2. Matching Arity Methods Applicable by Method Invocation Conversion
  3. Applicable Variable Arity Methods
  4. 在每个部分中,提到如果在给定阶段中找到适用的方法,则从那些中选择要调用的方法。只有当阶段没有产生适用的方法时,搜索才会进入下一阶段。

    由于最后搜索变量方法,这意味着将优先调用任何非变量的匹配方法。