📜  Java中的方法重载和空错误

📅  最后修改于: 2020-03-30 14:59:37             🧑  作者: Mango

在Java中,重载Java中的方法非常普遍。下面是一个有趣的Java程序。

public class Test
{
    // Overloaded方法
    public void fun(Integer i)
    {
        System.out.println("fun(Integer ) ");
    }
    public void fun(String name)
    {
        System.out.println("fun(String ) ");
    }
    // 测试代码
    public static void main(String [] args)
    {
        Test mv = new Test();
        // 引起报错
        mv.fun(null);
    }
}

输出:

22: error: reference to fun is ambiguous
        mv.fun(null);
          ^
  both method fun(Integer) in Test and method fun(String) in Test match
1 error

在上述情况下出现编译时错误的原因是,这里的方法参数Integer和String都不是Java中的原始数据类型。这意味着它们接受空值。当我们将null值传递给method1时,编译器会迷惑它必须选择哪个方法,因为两者都接受null。
除非我们有意传递空值,否则不会发生此编译时错误。例如,请参见下面的场景,在编码时我们通常会遵循以下场景。

public class Test
{
    // Overloaded方法
    public void fun(Integer i)
    {
        System.out.println("fun(Integer ) ");
    }
    public void fun(String name)
    {
        System.out.println("fun(String ) ");
    }
    // 测试代码
    public static void main(String [] args)
    {
        Test mv = new Test();
        Integer arg = null;
        // 不是编译器错误
        mv.fun(arg);
    }
}

输出:

fun(Integer )

在上述情况下,如果由于表达式的结果“ arg”值为空,则将空值传递给method1。在这里我们不会得到编译时错误,因为我们指定了参数为Integer类型,因此编译器选择method1(Integer i)并执行其中的代码。
注意:当重写的方法参数是原始数据类型时,此问题将不会持续。因为编译器将选择最合适的方法并执行它。