gpt4 book ai didi

Java 7 接口(interface)和名称冲突

转载 作者:行者123 更新时间:2023-11-30 08:08:51 25 4
gpt4 key购买 nike

我正在编写代码,其中一个类实现了两个接口(interface),这两个接口(interface)恰好有两个具有相同名称的抽象方法,以及两个具有相同标识符的常量:

public class Test implements A,B {

public void doStuff() {}

public void make() {}

public static void main(String[] args) {
Test t=new Test();
System.out.println(A.VALUE);
System.out.println(B.VALUE);
//System.out.println(Test.VALUE);
//System.out.println(t.VALUE);
}

}


interface A { // implicitly abstract

int VALUE=11; // implicitly public static and final

void doStuff(); // implicitly public and abstract

}


interface B {

int VALUE=14;

void make();

void doStuff();

}

现在,我知道从 Java 7 开始,就抽象方法而言,我不必担心名称冲突(对吗??):我只是提供了一个合适的实现,我很好(所有覆盖了共享相同名称的方法),所以我不会遇到类似多重继承的问题或“钻石”(我想这是我在进入 Java 8 时要处理的问题)。

但是,就常量而言,我注意到如果我实现这两个接口(interface)并且不尝试访问 VALUE 字段,编译器不会提示。它会提示,当我取消注释打印语句时。

怎么样?这是正常行为吗?仅当我访问这些成员时才出现错误?

编辑 我的意思是,当我尝试实现接口(interface)时,为什么编译器没有警告我歧义?

最佳答案

now, I know that as of Java 7, I don't have to worry about name clashing,as far as abstract methods are concerned (right??)

这不是 Java 7 中的新内容。由于方法在两个接口(interface)中具有相同的签名,因此当您在类中实现该方法时,它会为两个接口(interface)实现它。那里没有问题,因为没有歧义。

How is it? is this a normal behaviour? I get an error only when I access those members?

是的,当然这是正常行为;它符合 Java 编程语言的规则(它不是 Java 编译器中的错误)。仅从两个接口(interface)继承常量本身不会导致歧义,因此这就是为什么您在尝试这样做时不会收到错误的原因。

如果你试图在没有限定的情况下使用常量,那么编译器不知道你指的是这两个中的哪一个,所以它会给你一个错误。

您必须指定要从哪个接口(interface)使用常量:

interface A {
int VALUE = 11;
}

interface B {
int VALUE = 14;
}

public class Example implements A, B {
public void method() {
// Use A.VALUE instead of just VALUE
System.out.println(A.VALUE);
}
}

关于Java 7 接口(interface)和名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32881556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com