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");
答案 0 :(得分:5)
方法重载解析有3个阶段。只有第3阶段和最后阶段考虑使用varargs作为潜在候选者的方法(并且只有在前几个阶段没有找到任何匹配候选者时才会发生该阶段)。因此,在您的示例中,编译器仅在第一步中考虑没有varargs的方法,因此没有歧义。
这种行为的原因是varargs方法是在Java 5中引入的,如果编译器在方法重载决策的第一阶段考虑它们,可能会导致现有代码中断。