当我传递null时,将运行哪个重载函数

gbt*_*mon 1 java methods null overloading reference

所以我可以将空值传递给java中的函数.我也可以在java中重载函数.但请考虑以下内容

public static void main(String ... args){
    doStuff(null);
}

public static void doStuff(String s){
      solveWorldHunger();
}

public static void doStuff(Integer i){
      nukeCanada();
}

public static void nukeCanada(){
 System.out.println("NO!");
}

public static void solveWorldHunger(){
  System.out.println("YAY!");
}
Run Code Online (Sandbox Code Playgroud)

无论什么样的代码顺序,以前的程序都会打印出YAY ...

谁能解释为什么jvm决定在solveWorldHunger函数上运行nukeCanada函数?

Roh*_*ain 12

编译器很清楚你不能存储nullprimitive int.因此,它决定采用具有String参数的方法.

但是,当您将第二个方法更改Integer为参数时,您将收到编译器错误.因为它们都有资格用null参数调用.所以,会有歧义.

所以,尝试改变你的第二种方法: -

public static void doStuff(String s){
      solveWorldHunger();
}

public static void doStuff(Integer i){  // Integer instead of `int`
      nukeCanada();
}
Run Code Online (Sandbox Code Playgroud)

并调用它null.您将看到编译器错误.

因此,在这种情况下,您可以使用类似这样的类型转换来调用适当的方法: -

doStuff((Integer)null);  // Calls Integer version
doStuff((String)null);   // Calls String version
Run Code Online (Sandbox Code Playgroud)

另外,还要注意的是,如果你有你2nd method拿一个参数是super typeString,喜欢Object的话就没有歧义,因为编译器现在将选择最具体的一个,即String论点.

因此,只有两种方法的类型不在同一继承层次结构中时,才会出现歧义.