2013-10-11 78 views
2

我有下面的代碼工作正常:如何在Java中指定泛型類的內部類?

class ingen 
{ 
    static class X 
    { 
    static class inner {} 
    static class A extends inner {} 
    static class B extends inner {} 
    } 

    static class Y 
    { 
    static class inner {} 
    static class A extends inner {} 
    static class B extends inner {} 
    } 

    X makeX (X.inner ... inner) 
    { 
    return new X(); 
    } 

    Y makeY (Y.inner ... inner) 
    { 
    return new Y(); 
    } 
} 

現在我想編寫一個通用的make方法。但我找不到如何指定泛型類的內部類的方法。我試過這個,但它不能編譯:

<T> T make (T.inner ... inner) 

有沒有辦法寫這個通用?

+0

你是怎麼聲明Generic類的? –

+0

這是一種通用的方法。 – ceving

+0

嗯。我想你不能那樣做。因爲'X'和'Y'不相關。 –

回答

4

爲什麼不只是超載make

X make(X.inner... inner) { 
    return new X(); 
} 

Y make(Y.inner... inner) { 
    return new Y(); 
} 

我不相信有辦法做到這一點與仿製藥,因爲有XY之間沒有任何關係,所以他們不能在第一地方燎類型參數的統一(雖然即使他們是相關的,它仍然是不可能的,因爲inner是靜態的)。


如果選擇重新設計你的類略有你可以嘗試這樣的事:

class Base { 
    class inner { 
    } 
} 

class X extends Base { 
    class A extends inner { 
    } 

    class B extends inner { 
    } 
} 

class Y extends Base { 
    class A extends inner { 
    } 

    class B extends inner { 
    } 
} 

<T extends Base> Base make(T.inner... inner) { 
    ... 
} 

雖然我會花點時間退一步考慮,如果這真的是你想要做什麼。它看起來很複雜,也許有一個更簡單的解決方案?

+0

X和Y可以繼承相同的基類。這會有幫助嗎? – ceving

+0

對,這是你可以用C++模板(它會根據'T'的類型參數生成單獨的方法)而不是Java泛型(它會生成單一方法)的事情。 'X.inner'和'Y.inner'是不同的類,沒有直接的關係,因此你不能對它進行建模。即使'X'和'Y'具有相同的基類(實際上它們是:Object'),除非用'X.inner'和''' Y.inner'。 –

+0

@ceving如果它們都是從一個公共基類*擴展而來的,並且*嵌套類是非靜態的,那麼你可能可以用泛型做些事情。 – arshajii