为什么界面只能在顶级类中声明?

Luk*_* Vo 10 java oop interface class inner-classes

好吧,我知道这是规则:

根据JLS:8.1.3内部类和封闭实例,内部类可能不会声明静态初始化器或成员接口.内部类可能不会声明静态成员,除非它们是编译时常量字段.

根据8.5.2静态成员类型声明,"成员接口始终是隐式静态的.允许但不需要声明成员接口明确列出静态修饰符".他们总是顶级的,而不是内心的.

我只是想知道为什么.如果我们被允许在内部类中声明接口会发生什么?如果我将内部类放入另一个类文件中,内部类是否会成为顶级类?

Tho*_*mas 7

如果我将内部类放入另一个类文件中,内部类是否会成为顶级类?

不,它仍然是一个内部类,文件名指示(IIRC它OuterClass$InnerClass.class).

内部类可以访问外部类的属性,即它们依赖于它们的外部类实例.使用接口你无法做到这一点.想象一个完全不相关的类,它必须由相应的外部类实例创建.如果外部类不知道谁实现了该接口,那该怎么办呢?

您可以做的是在外部类中声明静态接口,因此仅使用外部作为命名空间:

public class OuterClass {
  public static interface InnerInterface { //protected and private would be fine too, depending on what makes sense
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,我误解了这个问题,因为接口是静态的,这里是一个更新的代码片段:

 public class OuterClass {
  public static InnerClass { //static inner class making OuterClass just be a namespace
     public interface InnerInnerInterface { //protected and private would be fine too, depending on what makes sense
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,您可以定义一个抽象的内部内部类,缺点是您必须坚持单继承约束.

  • @WN:接口是隐式静态的.这个宣言只是减少了. (2认同)