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
编译器很清楚你不能存储null在primitive 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 type的String,喜欢Object的话就没有歧义,因为编译器现在将选择最具体的一个,即String论点.
因此,只有两种方法的类型不在同一继承层次结构中时,才会出现歧义.