变量的歧义而不是方法的歧义

Ambiguity for Variable but not for Method

我们有一个 interfaceclass 没有关系,每个方法都有相同的签名。这些可能与可以正常编译的 class 有关。

interface A {
    void test();
}

class B {
    public void test() {
        System.out.println("Test");
    }
}

public class MultipleLevelInheritance extends B implements A {

    public static void main(String[] args) {
        
        new MultipleLevelInheritance().test();
    }
}

但是当我们对 a 变量做同样的事情时,它会导致歧义。

interface A {
    int a = 10;
}

class B {
    public static int a = 9;
}

public class MultipleLevelInheritance extends B implements A {

    public static void main(String[] args) {
        
        System.out.println(a); //The field a is ambiguous
    }
}

即使我们在 B 中将 a 保持为 final,它仍然会导致错误。为什么对方法有效而对变量无效?

你的 class MultipleLevelInheritance 正在实现一个接口并扩展了一个 class,并且两者具有相同的 属性 名称 (a),当你在 MultipleLevelInheritance 中调用 a 时,Java 无法确定变量是指 A.a 还是 B.a。你只需要给它加上前缀。

当你实现一个接口时,所有变量都在class中继承。所以,当你扩展一个class并实现接口时,它会有两个变量a的声明。因此,您遇到了歧义错误。

但是说到方法,当你实现接口的时候,期望你提供接口中定义的方法的实现。在您的示例中,此实现由 class B 提供。因此没有错误。