如果我有一个实现两个接口的类,我将该类发送到一个接受任一接口的重载方法; 将调用该方法的哪个变体?
换句话说,如果我有这样的事情:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
我将我的C级发送到D中的方法:
doThings(C);
Run Code Online (Sandbox Code Playgroud)
应该叫哪种方法?Java标准是否涵盖了这一点?
rge*_*man 10
您将收到编译器错误,因为多个方法匹配,即两种doThings方法.
JLS确实涵盖了第15.12.2.5节中的内容.它介绍了如何解析哪种方法适用于调用方法的表达式.
否则,我们说方法调用是不明确的,并且发生编译时错误.
在找到匹配的多个方法之后发生这种情况,一个方法不再是"特定的"而不是另一个方法,并且没有abstract.
这会引发编译时错误.
"对于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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是确切的错误:
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
Run Code Online (Sandbox Code Playgroud)
不过,请注意,如果将x定义为AAA x = new C();
或BBB x = new C();,则编译为OK.现在
,x引用的类型(AAA或BBB)使
这个版本明确无误.