为什么Java禁止继承内部接口?

2022-09-02 13:29:11

也就是说,为什么以下“循环依赖”是不可能的?

public class Something implements Behavior {
    public interface Behavior {
        // ...
    }
}

由于接口不引用外部类,因此应该允许这样做;但是,编译器迫使我在类外部定义这些接口。对于这种行为,有什么合乎逻辑的解释吗?


答案 1

规格相关规则:

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4

如果 C 的扩展或实现子句中将 T 作为超类或超接口,或者作为超类或超接口名称的限定符提及,则类 C 直接依赖于类型 T。

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.1.3

如果 I 的扩展子句中提到 T,则接口 I 直接依赖于 T 类型,无论是作为超接口还是作为超接口名称中的限定符。

因此,如果 ,A 同时依赖于 和 。然后,规范禁止循环依赖关系。A extends|implements B.CCB

纳入依赖关系的动机尚不清楚。正如你所提到的,如果晋升到顶级,就类型系统而言,没有太大区别,那么为什么可以,但不是?授予嵌套类型确实对 的内容有一些实际的访问权限,但我在规范中找不到任何麻烦的东西。BB.CC2A extends C2A extends B.CB.CBA extends B.C

唯一的问题是什么时候是内部类。假设 应该禁止,因为存在“封闭实例”的循环依赖关系。这可能是真正的动机——禁止外层阶级继承内部阶级。实际的规则更加通用,因为它们更简单,即使对于非内部类也有意义。CB=AA extends A.C


答案 2

想象一下,你是编译器。

我们说你要创建一个类的东西。此类实现行为...但是行为还不存在,因为有些东西还没有注册......

你明白这个问题吗?

将类视为包含内容的框。行为包含在“某事”框中。但有些东西并不存在。


推荐