Java编译器如何能够区分这两个构造函数/方法?

2022-09-04 03:25:08
public class MyClass {

    private String string;
    private Object[] objects;

    // constructor 1
    public MyClass(String string, Object... objects) {
        this.string = string;
        this.objects = objects;
    }

    // constructor 2
    public MyClass(String string) {
        this.string = string;
    }

    public static void main(String[] args) {
        MyClass myClass = new MyClass("foobar");
    }

}

在这种情况下,Java编译器是如何决定使用而不是?为什么没有或类似的错误发生?constructor 2constructor 1The constructor ... is ambiguous

PS:这个问题也适用于经典方法


答案 1

仅当没有非 var-arg 方法/构造函数时,才会选择 var-args 方法/构造函数。因此,很明显,为什么编译器选择.MyClass(String string)


答案 2

调用它始终是最具体的方法。

new MyClass("foobar");

搜索以调用该构造函数,该构造函数将类型对象作为唯一的参数。String

并且,将使用方法,因为匹配方法不存在。var-argsnon-var-args