如果我有一个实现两个接口的类,我将该类发送到一个接受任一接口的重载方法;将调用该方法的哪个变体?
换句话说,如果我有这样的话:
interface A {}
interface B {}
class C implements A, B { }
class D
{
public static void doThings(A thing){ System.out.println("handling A");}
public static void doThings(B thing){ System.out.println("handling B");}
public static void main(String[] args) {
doThings(new C());
}
}
我将课程C发送到D:
中的方法doThings(C);
应该调用哪种方法? Java标准是否涵盖了这个?
答案 0 :(得分:10)
您将收到编译器错误,因为多个方法匹配,即两个doThings
方法。
JLS确实在Section 15.12.2.5中介绍了这一点。它介绍了如何解决哪种方法适用于调用方法的表达式。
否则,我们说方法调用是不明确的,并且发生编译时错误。
在找到匹配的多个方法之后会发生这种情况,一个方法不再是“特定的”,而不是abstract
。
答案 1 :(得分:6)
这会引发编译时错误 "对于D"类型,方法doThings是不明确的 所以这是你的答案。
interface AAA { }
interface BBB { }
class C implements AAA, BBB { }
public class D
{
public static void doThings(AAA thing){
}
public static void doThings(BBB thing){
}
public static void main(String[] args){
C x = new C();
D.doThings(x);
}
}
这是确切的错误:
C:\Programs\eclipse\workspace\TEST\src>javac D.java
D.java:17: reference to doThings is ambiguous, both method doThings(AAA) in D and method doThings(BBB) in D match
D.doThings(x);
^
1 error
请注意,如果您将x定义为AAA x = new C();
或者作为BBB x = new C();
,然后编译好。现在
x
引用的类型(AAA或BBB)使得
这个版本毫不含糊。
答案 2 :(得分:3)
它会给你一个编译时错误:“方法doThings(A)对于类型D是不明确的。”
要修复此问题而不是调用
doThings(new C());
你可以打电话
<强> doThings((A)new C());
强>
或
<强> doThings((B)new C());
强>
答案 3 :(得分:2)
这是compile time error
。甚至不是运行时,编译时错误。
This link清楚地解释了。
It is possible for a class to inherit more than one field with the same name. Such a situation does not in itself cause a compile-time error. However, any attempt within the body of the class to refer to any such field by its simple name will result in a compile-time error, because such a reference is ambiguous.
这正是你想要做的。
答案 4 :(得分:2)
我同意那些说明这会导致Java编译时错误的人。
值得注意的是,Java是一种静态类型语言 - 对于这种情况,这意味着:将在编译时确定将调用哪些方法(在本例中)。
此规则有例外 - 例如,通过反射进行方法调用时。
因此,在这种情况下,当编译器尝试确定将调用绑定到哪个方法时 - 它将被强制进入模糊情况 - 导致编译时错误。