所以我可以将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 作为该方法的参数传递。