1

所以我可以将空值传递给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 始终决定在solveWorldHunger函数上运行nukeCanada函数吗?

4

2 回答 2

12

编译器很清楚你不能存储nullprimitive int. 因此,它决定使用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的参数是super typeof StringObject则不会有歧义,因为编译器现在将选择最具体的参数,即String参数。

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

于 2012-11-29T21:40:05.277 回答
1

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

于 2012-11-29T21:41:14.740 回答