2014-12-18 123 views
2

此代碼是非法的,因爲Bar不能使用通用T,因爲它屬於Foo,而Bar是靜態的。 :(有沒有辦法讓兩個類使用相同的泛型?

public interface Foo<T> { 
    public interface Bar { 
     public void bar(T t); 
    } 

    void foo(T t, Bar bar); 
} 

我的問題是,是否有一個合理的解決方法這個問題嗎?我真的需要Foo和酒吧中使用相同的通用類型,因爲酒吧是一個富監聽器類,需要返還相同種類。當然,我可以用兩個泛型(如Bar<P>),並始終分配相同的類型T和P,但是這是時髦且容易出錯是否有一個清晰的解決方案

+2

泛型類型參數僅適用於實例,而不是靜態的成員或類型。 – SLaks

+2

在我看來,強制兩個實例使用相同類型參數的地方是當它們一起使用時。你有一個示例用例(帶代碼)嗎? –

+1

不需要有一些類繼承Foo或Bar來使用它們中的任何一個嗎?另外,它是否有助於製作特定類型的Bar:'public interface Bar ' – mbomb007

回答

3

的解決方案是讓Bar通用:?

public interface Foo<T> { 
    public interface Bar<T> { 
     public void bar(T t); 
    } 
    ... 
} 

或者,如果你想調用類型參數有所不同:

public interface Foo<T> { 
    public interface Bar<U> { 
     public void bar(U t); 
    } 
    ... 
} 

這裏真的沒有什麼容易出錯的地方。如果你需要一個方法,比方說,註冊一個監聽器,它看起來像:

public interface Foo<T> { 
    public interface Bar<U> { 
     public void bar(U t); 
    } 

    public void addListener(Bar<T> listener); 
} 

這將確保,如果你添加一個偵聽到的東西,實現Foo<T>一個實例,那麼聽衆一定有什麼東西使用相同的通用參數實現Bar<T>(如果您不使用原始類型)。

+0

這是我一直在尋找的解決方案!它強制Foo和Bar使用相同的泛型類型(通過addListener())而不違反其靜態性。 :) –

1

爲什麼打擾嵌套接口?將其提升到頂層,然後將其組合到Foo類中。

Bar.java

public interface Bar<T> { 
    void bar(T t); 
} 

Foo.java

public class Foo<T> { 
    private Bar<T> bar; 

    void foo(T t) { 

    } 

    void bar(T t) { 
     this.bar.bar(t); 
    } 
} 
+0

我需要使用接口進行測試(即模擬對象)。 –

+1

它仍然是一個接口,它不是* nested *接口,但@ ajb的答案表明,效果真的是一樣的。 –

1

有沒有這樣的事,作爲一個非靜態接口。

對於你可以期望的行爲:

class A<T> { 
    class B { 
    void test(T works) { } 
    } 
} 

的界面,你將需要使用

interface A<T> { 
    interface B<T> { 
    void test(T works) { } 
    } 
} 

基本上是一樣的:

interface A<T> { 
} 

interface B<T> { 
    void test(T works) { } 
} 

實質上,int erfaces總是static,並static類(和接口)不繼承父母的仿製藥,因爲它違反了爲static的概念...

相關問題