接口层次结构中的循环

时间:2014-04-10 16:07:24

标签: java interface

使用这样的接口结构:

enter image description here

为什么A-D-F不会产生错误,因为它是一个循环?

注意:箭头A-> B表示A延伸B

4 个答案:

答案 0 :(得分:5)

我尝试在代码中解释您的图表,如下所示:

interface A extends B, C, D { }
interface B { }
interface C { }
interface D extends F{ }
interface E extends F{ }
interface F extends A{ }

编译器因错误而失败:

java: cyclic inheritance involving A

因此,正如预期的那样,不允许循环继承。

如果F 延长A,则错误消失。

答案 1 :(得分:2)

确实会产生错误,你试过吗?

interface A extends D {} // error on this line: The hierarchy of the type A is inconsistent
interface D extends F {} // error on this line: The hierarchy of the type D is inconsistent
interface F extends A {} // error on this line: Cycle detected: a cycle exists in the type hierarchy between F and A

答案 2 :(得分:1)

我见过以下疯狂的用法:

interface I {
    static final I CONSTANT = new C();
    ...
}

class C implements I {
}

这有效的原因是.class(如二进制.obj)包含有关其导入的符号信息。因此.java可以编译为.class。然后可以完成与其他.class文件的链接。

出于同样的原因(松散链接),当使用不同版本的jar进行编译时,执行可能会失败,而不是在运行时。

但是有些编译器可能会在特定的周期中不知道。


添加一个

如果一个接口使用来自另一个接口的常量,则在编译时这些常量存储在.class文件中,实际上导入会消失。在这种情况下,至少有一个编译器不检测依赖关系,并且可能会破坏循环。这甚至可能导致错误的,陈旧的常数;反模式。

答案 3 :(得分:0)

错误在D延伸F和E延伸F和F延伸A ... 因为JAVA不支持多重继承......这就是为什么引入接口的原因