【问题标题】:When I pass a null, which overloaded function will java run当我传递一个null时,java会运行哪个重载函数
【发布时间】:2012-11-29 21:38:23
【问题描述】:

所以我可以将空值传递给 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 函数?

【问题讨论】:

  • 好吧,以int 开头的@ 不能为空...Integer 的示例可能更有趣。
  • 因为Java是一种仁慈的编程语言。
  • 如果使用不同的复杂类型重载方法,则必须将 null 强制转换为这些类型之一。
  • 现在您编辑的代码将无法编译。方法调用中的歧义。

标签: java methods reference null overloading


【解决方案1】:

编译器很清楚您不能将null 存储在primitive 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 typeString 的参数,例如 Object,则不会有歧义,因为编译器现在将选择最具体的一个,即String 参数。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 关于第二次重载的部分不正确。如果他有另一个以 Object 为示例的重载,则以 String 为示例的重载将被选为最具体的。如果他只有不可通约类型的重载,比如 String 和 Integer,他会得到一个编译错误。
    • 很好——我不是指对象中的对象,我也不知道这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2022-01-26
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多