当我传递一个空值时,哪个重载函数将运行java



所以我可以将null传递给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!");
}

以前的程序无论巫术代码的顺序如何,都会打印出YAY...

谁能阐明为什么 jvm 始终如一地决定在nukeCanada函数上运行solveWorldHunger函数?

编译器

很清楚,你不能在primitive int中存储null。因此,它决定使用String作为参数的方法。

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

因此,请尝试更改第二种方法:-

public static void doStuff(String s){
      solveWorldHunger();
}
public static void doStuff(Integer i){  // Integer instead of `int`
      nukeCanada();
}

并在null上调用它。您将看到编译器错误。

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

doStuff((Integer)null);  // Calls Integer version
doStuff((String)null);   // Calls String version

另外,请注意,如果你的2nd method采用一个String super type的参数,比如Object,那么就不会有歧义,因为编译器现在将选择最具体的一个,即String参数。

因此,仅当有两个方法的类型不在同一继承层次结构中时,才会发生歧义。

只有你的 doStuff(String) 方法可以接受 NULL 参数...原始 int 永远不能为空。 如果您有第二个方法重载传递了一个对象,您将无法再将 null 作为该方法的参数传递。

相关内容

  • 没有找到相关文章

最新更新