Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义类的Java函数重载歧义_Java_Overloading - Fatal编程技术网

自定义类的Java函数重载歧义

自定义类的Java函数重载歧义,java,overloading,Java,Overloading,我有两个函数调用:一个将字符串作为参数,另一个将对象作为参数。当我这样做时: foo(Object a){...} foo(String s){...} foo(CustomClass a){...} foo(String s){...} 然后打电话: foo(null); foo(null); 它很好用 但是,如果我这样做: foo(Object a){...} foo(String s){...} foo(CustomClass a){...} foo(String s){...

我有两个函数调用:一个将字符串作为参数,另一个将对象作为参数。当我这样做时:

foo(Object a){...}
foo(String s){...}
foo(CustomClass a){...}
foo(String s){...}
然后打电话:

foo(null);
foo(null);
它很好用


但是,如果我这样做:

foo(Object a){...}
foo(String s){...}
foo(CustomClass a){...}
foo(String s){...}
然后打电话:

foo(null);
foo(null);
Eclipse告诉我它是不明确的。所以有两个问题:

  • 为什么第一个案例不含糊
  • 我怎么修理
  • 为什么第一个案例不含糊

    这是因为
    String
    Object
    的一个子类型,编译器选择最具体的一个。因此选择了带有
    字符串
    参数的方法

    我怎么修理

    在第二种情况下,由于这两种参数类型不在同一继承层次结构中,因此会产生歧义。你无法避免。因为,
    null
    同样有资格分配给这两种
    类型。编译器没有可供选择的特定类型

    通过显式地将
    null
    强制转换为所需类型,可以避免
    歧义错误

    因此,以下调用可以正常工作:-

    foo((String)null);   
    foo((CustomClass)null);
    

    编译器无法选择,但如果知道要调用哪个方法,可以将null强制转换为所需的类型,以便推断该方法。@pabrantes。为什么会有演员?
    null
    不是与
    String
    CustomClass
    完全匹配吗?你说的没错,但是由于返回类型不是方法签名的一部分,foo(String)和foo(CustomClass)可能会返回不同的类型,如果你知道你要寻找的返回类型,显式转换可以解决问题。虽然这是一个极端的情况(大多数情况下是一个糟糕的界面设计),但它发生了有趣的线索:@pabrantes。。事实上,现在我明白了,你想说什么。相应地编辑了答案。谢谢:)