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

2022-09-03 01:12:19

我基本上有一个关于为什么以下内容不起作用的问题。我有一个抽象类:

public abstract class Abstrct <T> {

}

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

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

    }
}

由于我还在学习Java,我对为什么它不起作用更感兴趣。与其说如何使它工作,不如说我对此感兴趣。


答案 1

Inner不在 的类声明范围内。在子句中使用时,它不是已知的类型名称。使用限定引用:Outerextends

class Outer extends Abstract<Outer.Inner>

或者导入它:

import com.example.Outer.Inner;

从规范来看,关于范围

在类类型 (§8.1.6) 中声明或由类类型继承的成员的声明的作用域是 C 的整个主体,包括任何嵌套的类型声明。mC

该子句是类声明的一部分,如规范中所述。它不是类主体的一部分。extendsSuperclass

但是,语句中使用的类型的范围,import

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


答案 2

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


推荐