java类中的多个接口 - 用于方法调用?

Mic*_*ill 8 java inheritance

如果我有一个实现两个接口的类,我将该类发送到一个接受任一接口的重载方法; 将调用该方法的哪个变体?

换句话说,如果我有这样的事情:

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.

  • 作为附加信息,如果我们想要显式调用变量处理`A`或`B`,我们可以使用我们感兴趣的类型的引用,或者只使用像`doThings((B)new C())这样的大小写;` . (2认同)

pet*_*rov 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);
    }
}
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)使
这个版本明确无误.