当前位置: 首页 > 面试题库 >

带空参数的Java方法分派

广昊昊
2023-03-14
问题内容

为什么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的第二个答案中的评论。)谢谢大家的帮助。


问题答案:

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

}


 类似资料:
  • 我已经得到了一个抽象类位置的UML图。该类有一个变量字符串名称。它的方法是addEmployee(employee:employee):boolean。 Employee类与Location类相关联。Employee类必须包含变量String name和String address以及方法getName():String和getAddress():String 我不确定如何制作addEmploye

  • 问题内容: 在Java 8中,具有以下类 可以通过方法引用来调用setBornTrue方法: 但是我将如何使用forEach方法并通过 方法引用 使用setBorn ?试: 导致错误“无法解析方法setBorn”。 另外,我该如何传递True的值? 问题答案: 使用lambda: 没有发现仅使用Java 8 API的其他方法。 使用此自定义功能: 你可以做: 如果Java API或库中提供了这种实

  • 我试图模仿下面的行,但它在执行时给出了一个错误,它说: 此处检测到错误的参数匹配器: when(mock.get(anyInt())).thenreturn(null); doThrow(new RuntimeException()).When(mock).SomeVoidMethod(anyObject()); verify(mock).somemethod(contains(“foo”)) 这

  • 我正在通过XML配置和实例工厂方法实例化一些bean: 我实例化我的原型bean编程由BeanFactory.getBean(bean,参数...): 在Spring3中,我想切换到基于java的带注释bean配置。这是我的FactoryBean: 我的问题:如何在这里传递参数?上面的代码将org.springframework.beans.factory.NoSuchBean定义异常:没有类型[

  • 我已经用Java开发了一个应用程序,我正在尝试使用Powermockito创建单元测试(我应该补充一点,我是单元测试新手)。 我有一个名为Resource的类,它有一个名为readResources的静态方法: ResourcesElement也由我编写。在测试中,我想创建自己的资源,所以我希望上面的方法什么都不做。我试着使用以下代码: 单元测试引发异常: org.mockito.exceptio

  • 你好,伙计们,我有一个问题,在一个角4.3+Spring引导Rest应用程序上张贴多部分表单-数据。无论我在Java方法中放入什么参数,我都会得到消息“Required request part'arquivo'is not present”或“Required request parameter'arquivo'is not present”。