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

时间:2014-03-26 23:59:57

标签: 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());
    }
}

我将课程C发送到D:

中的方法
doThings(C);

应该调用哪种方法? Java标准是否涵盖了这个?

5 个答案:

答案 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是一种静态类型语言 - 对于这种情况,这意味着:将在编译时确定将调用哪些方法(在本例中)。

此规则有例外 - 例如,通过反射进行方法调用时。

因此,在这种情况下,当编译器尝试确定将调用绑定到哪个方法时 - 它将被强制进入模糊情况 - 导致编译时错误。