2009-11-20 56 views
0

我有以下幾點:Java泛型/抽象/內部類的語法問題

public abstract class Foo<T>{ 
    //contents of Foo // 
     ... 
    public class Bar<Q> extends Foo<T>{ 
     //contents of Foo.Bar // 
     ... 
    } 
} 

後來,在另一個類和java文件,我試圖構建上述內酒吧類的實例,使用外部抽象類作爲超類型。讓事情更復雜的是,新班級有它自己的通用性。以下不起作用:

public class SomeOtherClass<A>{ 
    private Foo<A> x; 

    public SomeOtherClass(){ 
     x = Foo<A>.Bar<A>(); 
    } 
} 

但這不起作用;而且我所嘗試過的所有其他組合也不做。那麼我怎麼去實例化x?除去Foo的參數可以完成嗎?我不想刪除Foo的參數,因爲它的抽象方法在它們的簽名中有通用參數。

+0

我沒有意識到有一個地方可以接受最好的答案。對不起! – Jay 2009-11-20 22:49:46

+0

記得儘可能使用靜態嵌套類而不是內部類,並且觀察大部分奇怪的混淆問題就會消失。 – 2009-11-20 23:37:54

回答

3

要獲得內部類的實例,首先需要外部類的實例。由於您的示例中的Foo是抽象的,因此您無法實例化外部類。因此你也不能實例化內部類。

爲了您的例子中,你可以使用骯髒的伎倆(因爲沒有抽象的方法來實現)

public class SomeOtherClass<A>{ 
    private Foo<A> x; 
    public SomeOtherClass() { 
     //create anonymous extension of the abstract outer class 
     //for a real abstract class this would mean you have to 
     //implement all methods which are declared abstract 
     x = new Foo<A>(){}; 
     x = x.new Bar<A>(); 
    } 
} 

所以其實你應該問自己,如果你的類結構是正確的,如果你需要一個內部類訪問(Bar)抽象類(Foo),而不需要封閉類。

+0

謝謝。這是一個聰明的伎倆。我認爲我只是懶惰的內心階層。 – Jay 2009-11-20 22:59:33

-1

Bar是Foo的非靜態內部類。這意味着你需要一個Foo的實例來構造一個Bar實例。如果你不想要一個Foo的實例,那麼Bar應該是一個靜態的內部類。

+1

由於Foo是抽象的,不能實例化 – jitter 2009-11-20 22:51:31

+0

謝謝!這是我的想法。 – Jay 2009-11-20 22:51:56

+1

奇怪的是,這個答案是正確的,直到代碼片斷正在做一些完全不同的事情,並且是錯誤的。 – 2009-11-20 23:03:57

0

除了探索的緣故,嵌套的動機BarFoo以內的動機是什麼?這看起來像enumEnum如何工作,但沒有幕後的編譯器魔法來隱藏大部分的怪異。

如果Foo是不完整的,它意味着從遠處延伸 - 即使只是從其包含的包內(如果該類未聲明爲公共的)。嵌套在不完整果殼內的擴展只會混淆潛在客戶。

如果您分享有關實際問題域的更多詳細信息,您可能會就如何更好地建模解決方案召集大量具體答覆。