一尘不染

带空参数的Java方法分派

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的方法是静态的,而我的不是。但是我真的不明白为什么这应该有所作为…?

更新2:
解决。我在类中有另一个方法foo(Runnable),因此调度程序无法明确选择单个最特定的方法。(请参阅我在Hemal的第二个答案中的评论。)谢谢大家的帮助。


阅读 500

收藏
2020-09-08

共1个答案

一尘不染

您正在使用哪个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)");
  }

}
2020-09-08