【问题标题】:Ambiguity for Variable but not for Method变量的歧义,但不是方法的歧义
【发布时间】:2020-11-29 08:25:20
【问题描述】:

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

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,它仍然会导致错误。为什么对方法有效而对变量无效?

【问题讨论】:

    标签: java variables inheritance methods ambiguity


    【解决方案1】:

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

    【讨论】:

    • 和方法,不会有歧义,只有一种实现
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多