2011-09-27 36 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的嵌套類不能在父類的聲明中使用。

相關問題