如何在java中扩展抽象内部类

Joh*_*ith 0 java inner-classes

我很困惑

Abstract Class A{method();method2();}
Run Code Online (Sandbox Code Playgroud)

和其他Class B有内在的Class C

Class B{Abstract Class C{method(){//body}}}
Run Code Online (Sandbox Code Playgroud)

现在问题是如何扩展C类B/C抽象类必须扩展,否则这是Unused类.

Jon*_*eet 7

首先,让我们简单一点 - 这与Android没有直接关系,你根本不需要你的A课程.这是你想要的:

class Outer {
    abstract class Inner {
    }
}

class Child extends Outer.Inner {
}
Run Code Online (Sandbox Code Playgroud)

这并不编译,因为当你创建一个实例Child,你需要提供的实例OuterInner构造函数:

Test.java:6: error: an enclosing instance that contains Outer.Inner is required
class Child extends Outer.Inner {
^
1 error
Run Code Online (Sandbox Code Playgroud)

有两个选项可以解决这个问题:

  • 如果您不需要引用Outerfrom 的隐式实例Inner,则可以Inner改为创建静态嵌套类:

    static abstract class Inner {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以更改Child为接受对实例的引用Outer,并使用来调用Inner构造函数,该构造函数使用稍微令人惊讶的语法,但有效:

    Child(Outer outer) {
        // Calls Inner constructor, providing
        // outer as the containing instance
        outer.super();
    }
    
    Run Code Online (Sandbox Code Playgroud)

请注意,这些是替代方案 - 您应该根据内部类是否真的需要成为内部类来选择您想要的那个.

  • 呃 - 我突然明白了 JLS 的概念,即前缀只是封闭类的一个实例 - 毕竟并不是那么困难,只需要 - 你知道 - 读几遍。正是在您提供的报价中。谢谢。让我想知道为什么你会考虑以这种方式设计...... (2认同)