【问题标题】:Extending an Inner class into a Nested class?将内部类扩展为嵌套类?
【发布时间】:2013-12-01 20:10:59
【问题描述】:

我正在学习嵌套类和内部类,这让我思考是否可以将内部类扩展为嵌套类。例如。

public class Outer{

    public class Inner{
        // notice the lack of static keyword
    }
}


public class ExtendedOuter extends Outer{

    public static class ExtendedInner extends Inner{
        // notice the static keyword
    }
}

我确实尝试编译上面的代码,但我不能,但我收到的编译时错误让我相信可能有一个解决方法。但是,我可以将嵌套类扩展为内部类。

这是我收到的编译时错误。

范围内没有外部类型的封闭实例

【问题讨论】:

  • static 类不能扩展非static 内部类。
  • Inner 应该是静态的,否则它必须绑定到 Outer 的实例,就像错误消息告诉你的那样。

标签: java compiler-errors compiler-warnings inner-classes


【解决方案1】:

内部类具有对外部类的引用。您不能在子类中删除它。这就像删除子类中的字段一样。

【讨论】:

  • 我明白了,换句话说,没有变通办法,内部类不能扩展为嵌套类,对吗?感谢您的回答。
  • 一个 inner 类具有对外部类的引用。您可以通过将嵌套类设为静态而不是内部来删除它。
  • @twimB 因为这没有意义,不。
【解决方案2】:

其实你可以扩展内部类。您只需提供该类将绑定到的Outer 实例。为此,您必须使用实例显式调用 super 构造函数。

public class Outer {
    public class Inner{
        // notice the lack of static keyword
    }
}

public class ExtendedOuter extends Outer {

    private static Outer outer = new ExtendedOuter(); // or any other instance

    public static class ExtendedInner extends Inner {
        public ExtendedInner() {
            outer.super(); // this call is explicitly required
        }
    }

}

如果您有一个嵌套类从不同的封闭类扩展另一个嵌套类,这也适用。

【讨论】:

  • 非常感谢,出于某种原因,这是我怀疑可能存在的那种工作。非常感谢。
【解决方案3】:

你的问题没有意义。内部类已经是一个嵌套类,在另一个类中定义的任何其他类也是如此。显然你不知道这些词是什么意思:

  • 嵌套类:在另一个类中声明的类
  • 内部类:未声明为“静态”的嵌套类。

请注意,“静态嵌套”和“内部”是互斥的。另请注意,内部类可以扩展静态嵌套类,反之则不行。

您的代码实际上试图做的是将内部类扩展为 static 类,这就是导致错误的原因。不是因为扩展类是嵌套的。

【讨论】:

  • 嗯,对我来说这个问题很有意义,因为这个目的只是为了知道是否有可能我还没有需要在我的代码中应用上述内容。正是编译时错误让我觉得可能有办法这样做
  • 如果你理解了我的回答,你也应该明白这个问题没有任何意义。因此,您还没有理解我的答案。我建议你再读一遍。我已经告诉过你什么是可能的,什么是不可能的,但你甚至不需要问已经在逻辑上蕴含的东西是否是“可能的”。您显然对术语有误解。您在代码中实际上尝试的不是要嵌套的扩展,而是要静态的扩展。这不是一回事。
  • 也许是我没有得到您在回答中试图解释的内容。然而,彼得劳里的回答让我很清楚。如果我问的问题略有不同,例如“是否可以将非静态嵌套类扩展为静态嵌套类”,对您来说可能会更有意义。我知道非静态嵌套类必须绑定到封闭类的实例。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2012-03-16
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多