自定义类的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。。事实上,现在我明白了,你想说什么。相应地编辑了答案。谢谢:)