为什么以下代码存在编译错误:
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
除了将内部类放在自己的文件中之外,还有解决这个问题的方法吗?
答案 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
的嵌套类根本不能在父类的声明中使用。