为什么null直接将我作为参数传递,或者传递给Object我分配了 值的键 (显然)会有所不同null?
null
Object
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)?
foo(...)
foo(Object)
更新: 我使用Java 1.6。我可以毫无问题地编译Hemal的代码,但是我的仍然无法编译。我看到的唯一区别是Hemal的方法是静态的,而我的不是。但是我真的不明白为什么这应该有所作为…?
更新2: 解决。我在类中有另一个方法foo(Runnable),因此调度程序无法明确选择单个最特定的方法。(请参阅我在Hemal的第二个答案中的评论。)谢谢大家的帮助。
您正在使用哪个Java版本?在1.6.0_11中,代码(粘贴在下面)可以编译并运行。
我敢肯定,为什么foo(testVal)会这样foo(Object)。
foo(testVal)
为什么原因foo(null)去foo(String)有点复杂。该常量null是type nulltype,它是所有类型的子类型。因此,这nulltype扩展了String,扩展了Object。
foo(null)
foo(String)
nulltype
String
调用时,foo(null)编译器将查找具有最特定类型的重载方法。因为String更具体Object,所以这就是被调用的方法。
如果您有另一个与String一样特定的重载,foo(Integer)那么您将得到一个模棱两可的重载错误。
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)"); } }