2011-09-27 39 views
14

子类的为什么下面的代码有编译错误:找不到类型参数,如果它是一个内部类在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 

除了将内部类放入其自己的文件中,是否有解决此问题的方法?

+0

这是一个有趣的问题......我不确定该语言是否允许,因为Java泛型是通过类型擦除实现的。我希望你必须让MyFooInner成为顶级课程。 –

回答

24

使用下列符号:

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

UPDATE

A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.

因此,只有这样,你可以参考一个:为指定的here静态内部类是有效的顶层类静态嵌套类在某处提到它的父类。否则,它是对一个导入的类或相同包中的一个类的引用。

UPDATE:要解释它甚至更多,来引用类的另一种方式是将其导入这样的:

import my.package.MyFoo.MyFooinner; 

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

你能解释吗?还是只是一个幸运的猜测? – BalusC

+0

+1,但请解释它非常有趣。 – Heisenbug

+2

这就是您引用静态嵌套类的常用方法:http://download.oracle.com/javase/tutorial/java/javaOO/nested.html –

2

要建立在@Andrey Adamovich's answer,这样做的原因是,在一类鉴定类型声明必须对该类之外的成员有意义。这是一样的,如果我有 写在另一个类文件中的以下内容:

MyFooInner mfi = new MyFooInner() 

这将无法编译,因为该类不会知道什么是MyFooInner - 我要么需要通过写MyFoo.MyFooInner资格,或否则使用import MyPackage.MyFoo.MyFooInner;。同样的逻辑适用于类声明。

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

相关问题