为什么这不是一个模棱两可的电话? (varargs参数)

时间:2017-02-16 09:08:53

标签: java

public class SomeClass{
          public SomeClass(String...test){}

          public SomeClass(String a, String b){}

          public void someMethod(String...test){}

          public void someMethod(String a, String b){}
}

如果我写了类似的东西,编译器如何知道我的意思是哪个构造函数/方法

SomeClass c = new SomeClass("p1","p2"):

c.someMethod("p1","p2");

1 个答案:

答案 0 :(得分:5)

方法重载解析有3个阶段。只有第3阶段和最后阶段考虑使用varargs作为潜在候选者的方法(并且只有在前几个阶段没有找到任何匹配候选者时才会发生该阶段)。因此,在您的示例中,编译器仅在第一步中考虑没有varargs的方法,因此没有歧义。

这种行为的原因是varargs方法是在Java 5中引入的,如果编译器在方法重载决策的第一阶段考虑它们,可能会导致现有代码中断。