带空参数的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

回到顶部