在封闭类的超类型声明中使用嵌套类型作为泛型类型参数

use*_*133 17 java generics inner-classes

我基本上有一个问题,为什么以下不起作用.我有一个抽象类:

public abstract class Abstrct <T> {

}
Run Code Online (Sandbox Code Playgroud)

然后我定义了一个类,该类使用了一个定义了公共内部类的类,我想将它用于泛型参数,如下所示:

public class Outer extends Abstrct<Inner> {
    public class Inner {

    }
}
Run Code Online (Sandbox Code Playgroud)

当我正在学习Java时,我更感兴趣的是它为什么不起作用.与其如何使其工作无关,但我也会对此感兴趣.

Sot*_*lis 18

Inner不属于类声明的范围Outer.在extends子句中使用时,它不是已知的类型名称.使用合格的参考:

class Outer extends Abstract<Outer.Inner>
Run Code Online (Sandbox Code Playgroud)

或者导入它:

import com.example.Outer.Inner;
Run Code Online (Sandbox Code Playgroud)

从规范,关于范围:

m在类类型C(第8.1.6节)中声明或继承的成员声明的范围是整个主体C,包括任何嵌套类型声明.

extends条款是类Superclass声明的一部分,如规范中所述.它不是班级机构的一部分.

import但是,声明中使用的类型的范围,

[..] 是出现导入声明的编译单元中的所有类和接口类型声明(第7.6节),以及编译单元的包声明(如果有)的任何注释.

  • 或者简单地声明`public class Outer extends Abstract <Outer.Inner>`. (6认同)

m4k*_*tub 7

您可以使用Abstrct<Outer.Inner>明确且有效的类型.