【问题标题】:Java Outer Class extends static Inner Class [duplicate]Java外部类扩展静态内部类[重复]
【发布时间】:2016-09-12 16:11:49
【问题描述】:

这是允许的:

public class Outer {
    public static class Inner extends Outer { }
}

但这不是:

public class Outer extends Inner {
    public static class Inner { }
}

在第二种情况下,编译器会抱怨Cyclic inheritance involving package.Outer。我没有看到任何周期;为什么第二种情况无效?

无论 Inner 是 classabstract class 还是 interface,其行为都是相同的。

该用例用于递归数据结构——符号命名空间。基本上,我想要Namespace extends Namespace.MemberMyDataChunk extends Namespace.Member的命名结构;每个Namespace 都会像从StringNamespace.Member 的映射,因此允许向下递归多个级别的Namespace,以MyDataChunk 终止。

【问题讨论】:

  • 您看不到任何循环,但这是针对递归数据结构的。这似乎是矛盾的。另见stackoverflow.com/questions/33918022/…
  • @Tunaki 如果我没看错的话,类型不应该是循环的;实际的递归还没有出现(Map<String, Member> 的成员)。
  • @Tunaki 循环继承为A extends BB extends A,递归数据结构为A { member A }。在上面的代码中,如果我没看错的话,两者都不应该存在,尽管编译器会抱怨前者。
  • 不,你得到一个混合循环:外部类继承自嵌套类,嵌套类是外部类的成员。

标签: java inheritance inner-classes


【解决方案1】:

我没有看到涉及任何周期

我愿意:Outer 不能扩展 Outer.Inner 如果它不存在。要使Outer.Inner 存在,Outer 必须存在。它是 Catch-22,一种循环依赖。

【讨论】:

  • 如果我们将嵌套类 a member type 称为 JLS does,这将变得更加明显。
  • 确实有道理;我认为static 不会这样。这就是我问的原因!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2013-01-10
  • 2012-05-27
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
相关资源
最近更新 更多