带空参数的Java方法分派
为什么null
直接将我作为参数传递,或者传递给Object
我分配了 值的键 (显然)会有所不同null
?
Object testVal = null;test.foo(testVal); // dispatched to foo(Object)
// test.foo(null); // compilation problem -> "The method foo(String) is ambiguous"
public void foo(String arg) { // More-specific
System.out.println("foo(String)");
}
public void foo(Object arg) { // Generic
System.out.println("foo(Object)");
}
换句话说,为什么(commented-out)第二个调用foo(...)
没有分派给foo(Object)
?
我使用Java
1.6。我可以毫无问题地编译Hemal的代码,但是我的仍然无法编译。我看到的唯一区别是Hemal的方法是静态的,而我的不是。但是我真的不明白为什么这应该有所作为…?
解决。我在类中有另一个方法foo(Runnable),因此调度程序无法明确选择单个最特定的方法。(请参阅我在Hemal的第二个答案中的评论。)谢谢大家的帮助。
回答:
您正在使用哪个Java版本?在1.6.0_11中,代码(粘贴在下面)可以编译并运行。
我敢肯定,为什么foo(testVal)
会这样foo(Object)
。
为什么原因foo(null)
去foo(String)
有点复杂。该常量null
是type
nulltype
,它是所有类型的子类型。因此,这nulltype
扩展了String
,扩展了Object
。
调用时,foo(null)
编译器将查找具有最特定类型的重载方法。因为String
更具体Object
,所以这就是被调用的方法。
如果您有另一个与String一样特定的重载,foo(Integer)
那么您将得到一个模棱两可的重载错误。
class NullType { public static final void main(final String[] args) {
foo();
}
static void foo()
{
Object testVal = null;
foo(testVal); // dispatched to foo(Object)
foo(null); // compilation problem -> "The method foo(String) is ambiguous"
}
public static void foo(String arg) { // More-specific
System.out.println("foo(String)");
}
public static void foo(Object arg) { // Generic
System.out.println("foo(Object)");
}
}
以上是 带空参数的Java方法分派 的全部内容, 来源链接: utcz.com/qa/416884.html