可能重复:
方法重载为NULL参数
在下面的代码的输出为
串
和如果删除方法与类型的参数String
则输出是
宾语
我知道的方法重载时的参数类型不完全匹配,但我不明白怎么能空作为被处理的行为Object
和/或一个String
参数。
,这是什么解释?
class C {
static void m1(Object x) {
System.out.print("Object");
}
static void m1(String x) {
System.out.print("String");
}
public static void main(String[] args) {
m1(null);
}
}
它总是使用根据最具体方法的Java规范 ,部分15.12.2.5。
前奏是相当具体看:
如果不止一个成员方法既方便和适用于方法调用,就必须选择一个提供运行时方法调度描述符。 Java编程语言使用的是选择了最具体方法的规则。
非正式直觉是一种方法比另一种更具体的,如果通过第一种方法处理的任何调用可以被传递到另一个没有编译时类型错误。
一般来说,至少对于代码的可读性,它总是最好尝试尽可能明确。 你可以投你的null
到您要呼叫的签名相匹配的类型。 但是,这绝对是一个值得商榷的做法。 它假定每个人都知道这个规则,使代码更难以阅读。
但它是一个良好的学术问题,所以我+1你的问题。
当多个重载匹配的签名,从Java当中挑选最具体的方法。
值null
都匹配Object
和String
,但String
是的一个子类Object
,所以String
被采摘。 如果你的兄弟再添超载String
中的类层次结构,你会得到一个编译错误。\
// DOES NOT COMPILE
class C {
static void m1(Object x) {
System.out.print("Object");
}
static void m1(String x) {
System.out.print("String");
}
static void m1(Integer x) {
System.out.print("Integer");
}
public static void main(String[] args) {
m1(null);
}
}
下面是一个链接后 ,在一定长度的讨论您的代码示例。
如果您需要强制aprticular重载方法的调用时传递null
作为参数,你要投它,就像这样:
m1((String)null);
通过这样做,你要确保你调用该方法的正确重载版本。
你必须设置的类型null
告诉Java的你要调用什么功能。
所以,你做的: m1((Object) null);
打电话与实施Object
参数和你做m1((String) null);
调用另一个。
1.作为字符串也是一个目的 JVM
糊涂了要调用哪个方法在运行时 。
2.如果要指定在运行时调用哪个方法,您可以通过显式强制这样做
例如:
m1((String)null);