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



例如,为什么下面的"循环依赖项"是不可能的?

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

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

规范中的相关规则:

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

如果在C的extends或implements子句中提到T作为超类或超接口,或者作为超类名称或超接口名称的限定符,则类C直接依赖于类型T。

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

如果在I的extends子句中提到T作为超接口或作为超接口名称中的限定符,则接口I直接依赖于类型T。

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

B纳入依赖关系的动机尚不清楚。正如你所提到的,如果B.C被提升为顶级C2,那么就类型系统而言,没有什么不同,那么为什么A extends C2可以,而A extends B.C不行呢?假定嵌套类型B.C确实可以访问B的内容,但我在规范中找不到任何让A extends B.C麻烦的内容。

唯一的问题是当C是一个内部类时。假设B=AA extends A.C应该被禁止,因为存在"封闭实例"的循环依赖关系。这可能是真正的动机——禁止外部类继承内部类。实际的规则更为通用,因为它们更简单,而且即使对于非内部类也很有意义。

想象一下你就是编译器。

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

你明白这个问题吗?

将类视为包含事物的框。行为包含在盒子里。但有些东西并不存在。

语言规范禁止这一简单事实就足够了。

我能想到的一些原因:

  • 这不会有用。

  • 无论出于什么原因,你可能想要使用它,我相信还有更好的选择。

  • 子类应该扩展基类,那么为什么要在自己的子类中声明基类呢?

  • 让一个单独的类扩展你的内部类是违背直觉的。

相关内容

  • 没有找到相关文章

最新更新