2012-01-27 48 views
-1

考虑下面的代码:的Java可变参数方法的行为不同

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 

有谁能告诉我为什么?

+0

你的第三个行*是*'新CC()FF(1);'。请张贴您的原始代码,否则很难理解您的问题。顺便说一句,你的代码不能编译:你的方法被称为'FF()',但你尝试调用'FF()' – AlexR 2012-01-27 22:56:29

+1

我编辑你的代码中调用'ff',而不是'FF',所以它至少编译。我建议你再试一次,建立一个你想要解释的简单的repro例子,因为这 - 即使它编译 - 可能不是它。 – 2012-01-27 22:56:49

+1

看起来像示例代码中缺少的东西。 – user949300 2012-01-27 22:57:47

回答

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

在每种那些秒的提到如果在给定阶段找到适用的方法,则从中选择要调用的方法。只有当阶段没有产生适用的方法时,搜索才会进入下一个阶段。

由于可变的arity方法最后搜索,这意味着,任何匹配的方法是不变元数将被优先称为那些。