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

时间:2015-05-28 15:15:53

标签: java generics inner-classes

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

public abstract class Abstrct <T> {

}

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

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

    }
}

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

3 个答案:

答案 0 :(得分:18)

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

class Outer extends Abstract<Outer.Inner>

或导入它:

import com.example.Outer.Inner;

根据规范,关于Scope

  

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

extends子句是类Superclass声明的一部分,如Specification中所述。它不是班级组织的一部分。

import语句中使用的类型范围

  

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

答案 1 :(得分:7)

您可以使用Abstrct<Outer.Inner>使类型明确无误。

答案 2 :(得分:0)

您必须是显式的,因为您定义的内部类不是静态的,因此它只存在于包含类的范围内。 (见https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

在您的情况下,请尝试以下操作:

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

    }
}