如果它是Java中子类的内部类,则找不到类型参数

时间:2011-09-27 21:30:01

标签: java

为什么以下代码存在编译错误:

Foo.java:

public abstract class Foo<T> {
    public abstract T getInner();
}

MyFoo.java:

public class MyFoo extends Foo<MyFooInner> {
    public static class MyFooInner {
    }
    public MyFooInner getInner() {
        return new MyFooInner();
    }
}

编译第二个类导致:

MyFoo.java:1: cannot find symbol
symbol: class MyFooInner
public class MyFoo extends Foo<MyFooInner> {
                               ^
1 error

除了将内部类放在自己的文件中之外,还有解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:24)

使用以下表示法:

public class MyFoo extends Foo<MyFoo.MyFooInner> {...

UPDATE :静态嵌套类实际上是指定here的顶级类:

  

静态嵌套类与其外部的实例成员进行交互   类(和其他类)就像任何其他顶级类一样。在   效果,静态嵌套类在行为上是一个顶级类   已经嵌套在另一个顶级类中以方便包装。

因此,您可以引用静态嵌套类的唯一方法是在某处提及其父类。否则,它是对导入的类或同一包中的类的引用。

更新:为了解释它,引用该类的另一种方法是将其导入:

import my.package.MyFoo.MyFooinner;

public class MyFoo extends Foo<MyFooInner> {...

答案 1 :(得分:2)

要在@Andrey Adamovich's answer上构建,原因是类声明中标识的类型必须对该类之外的成员有意义。这就像我一样 在另一个类文件中写下以下内容:

MyFooInner mfi = new MyFooInner()

这不会编译,因为该类不知道MyFooInner是什么 - 我要么需要通过编写MyFoo.MyFooInner来限定它,要么使用import MyPackage.MyFoo.MyFooInner;。同样的逻辑适用于类声明。

出于同样的原因,声明为private的嵌套类根本不能在父类的声明中使用。