为什么这段代码给我编译使用Interface的时间错误以及我如何实现这段代码?请解释?

时间:2015-02-06 10:29:02

标签: java interface

有两个接口,并且具有最终的公共变量。

interface abc {
    int a = 10;

    public void display();
}

interface xyz {
    int a = 20;

    public void display();
}

public class NewClass implements abc, xyz {
    public NewClass() {
        System.out.println(a);
    }

    public static void main(String[] args) {
        NewClass obj = new NewClass();
        obj.display();
    }

    @Override
    public void display() {
        System.out.println("hello");
    }
}

7 个答案:

答案 0 :(得分:3)

您将未知引用到构造函数变量a。你必须这样做:

System.out.println(xyz.a);

System.out.println(abc.a);

取决于您要打印的确切a

答案 1 :(得分:2)

此字段a不明确,您无法实现2个相同的字段。此外 - 默认情况下,接口变量是静态和最终的。你甚至不需要将它们设置为静态决赛。

答案 2 :(得分:1)

a的引用是不明确的,因为它存在于NewClass实现的两个接口中。

要解决此问题,您需要指定要引用的变量。

使用System.out.println(abc.a)引用abc界面或System.out.println(xyz.a)中的变量来引用xyz

答案 3 :(得分:1)

这是the diamond of death

由于编译器不够智能,无法知道您要访问哪个最终变量,所以您可以告诉他使用哪个接口的final变量。

你必须像这样指定

System.out.println(xyz.a);

System.out.println(abc.a);

答案 4 :(得分:0)

a是"含糊不清的"。它可以属于xyz或abc。这就是编译器尖叫的原因

请参阅此代码:

public NewClass() {
    System.out.println(a); // a is "ambiguous". It could belong to either xyz or abc. That's why the compiler screams
}

更改您的代码以指定必须使用哪个接口。如此

 public NewClass() {
        System.out.println(xyz.a);
    }

答案 5 :(得分:0)

这就是命名空间冲突。

如果接口做了类似的事情,你应该从另一个扩展。如果没有,您应该以不同的方式命名方法。

interface abc {
    public void display();
}

interface xyz extends abc {
    int a = 20;
}

此外,如果接口中的默认方法不严格需要公共字段,则不应在接口中定义它们,而应在实现类中定义它们。否则给他们一个恰当的名字。

或者像这样访问变量/方法:

public NewClass() {
    System.out.println(xyz.a);
}

但在我的选择中这是不好的做法..

答案 6 :(得分:0)

如果您想在界面NewClassabc中使用变量'a',那么在课程xyz中没有任何变量'a',

public NewClass() {
    System.out.println(abc.a);
}

OR

public NewClass() {
    System.out.println(xyz.a);
}