方法重载相关:当null作为参数传递时

Method overloading related: when null is passed as a paramater

任何人都可以解释当 null 作为参数传递时下面程序的输出

 public class TestThis {

        public void method(Object o){
            System.out.println("object method");
        }

    public void method(int[] intArray){
        System.out.println("int array method");
    }

    public static void main(String[] args) {
        new TestThis().method(null);
    }

}

输出:- int数组方法

public class TestThis {

    public void method(Object o){
        System.out.println("object method");
    }

    public void method(int[] intArray){
        System.out.println("int array method");
    }

    public void method(double[] doubleArray){
        System.out.println("double array method");
    }

    public static void main(String[] args) {
        new TestThis().method(null);
    }

}

编译时错误:- 方法 method(Object) 对于类型 TestThis

不明确

编译器发现您有 两个 方法,它们都可以将 Object 作为参数(因为双精度数组是一个对象,也是)。

所以,当你只传递null时,编译器无法判断你要调用哪个方法。

什么会起作用:

new TestThis().method((double[]) null);

郑重声明:问题是 - 这与 多态性 无关,它与重载有关。编译器必须 修复 编译时 调用哪些重载方法。因此,如果您的源代码没有提供足够的信息来做出该决定,就会向您抱怨。

准确地说:在您的第一个示例中,有两种方法,编译器为 (Object) 选择了一种。

但是在你的第二个例子中,你得到了 三个 方法,其中两个比 (Object) 更具体。这就是它拒绝编译示例 2 的原因。

选择具有最具体/最少通用类型的方法。 Object 是所有其他 class 的 superclass,因此,在第一种情况下,选择 int[] intArray 方法。

第二种情况,你有2个类型在同一级别,这会导致编译问题。您不能有 StringStringBuilder,因为它们在 class 层次结构中处于同一级别。您可以有 ExceptionIOException,因为它们处于不同的级别。

null 可以传递给任何将引用类型作为参数的方法,但同时您需要确保您没有采用同一级别类型的方法。