如果内部类是私有的,为什么不允许在外部类泛型类型参数中使用内部类?

Que*_*inC 8 java

这可能是一个愚蠢的问题,但我很惊讶地发现不允许在外部类中使用私有内部类作为泛型类型。

如果我将内部类设置为受保护,则它可以正常编译。

另外,我必须精确Outer.Inner而不是仅仅Inner,否则找不到内部类。这看起来也有点奇怪。

为什么 Inner 不能私有?为什么它被允许受到保护?

public class Outer extends AbstractSet<Outer.Inner> {

  private static class Inner {
    // ...
  }
  
  // ... 
}
Run Code Online (Sandbox Code Playgroud)

错误是:

Outer.java:3: error: Inner has private access in Outer
public class Outer extends AbstractSet<Outer.Inner> {
                                                   ^
1 error
Run Code Online (Sandbox Code Playgroud)

我正在使用 Java SE 17,但我认为这并不重要。

Swe*_*per 6

请注意语言规范 \xc2\xa76.6.1private的含义,强调我的:

\n
\n

否则,成员或构造函数被声明为私有。仅当访问发生在包含成员或构造函数声明的顶级类或接口的主体内时,才允许访问。

\n
\n

extends子句不是类主体的一部分。类声明的语法如下所示(Classes):

\n
NormalClassDeclaration:\n{ClassModifier} class TypeIdentifier [TypeParameters] [ClassExtends] \n[ClassImplements] [ClassPermits] ClassBody\n\nClassBody:\n{ {ClassBodyDeclaration} }\n
Run Code Online (Sandbox Code Playgroud)\n

类的“主体”严格指大括号内的内容。Inner因此,您无法访问该子句中的私有类extends

\n

另一方面,如果Inner是或包私有,则允许访问,因为它们都允许从同一个包进行访问。protected

\n

类似地,成员类声明的范围也是类的主体(\xc2\xa76.3):

\n
\n

在类或接口 C 中声明或继承的成员 m 的声明范围(\xc2\xa78.2、\xc2\xa79.2)是 C 的整个主体,包括任何嵌套的类或接口声明。

\n
\n

因此,该extends子句不在Inner类的范围内,这就是为什么您需要使用更限定的名称来引用它,而不是其简单的名称。

\n