2016-03-23 52 views
0

我有一個通用接口,似乎無法將我的頭包圍在製作通配符捕獲幫助程序中,並且這使我瘋狂。使用通用接口進行Java通配符捕獲

我有一個接口:

public interface Foo<T extends Bar> { 
    boolean isA(T t); 
    T B(); 
} 

和它的實現被實例化這樣:

private Foo<? extends Bar> foo = new FooImpl(); 

這兩個無法改變,顯然我不能直接訪問FooImpl()。讓我們說,使用FooImpl(),接口接受並返回FooBar,它擴展了Bar。

我的編譯問題出現在我的代碼使用時, '富' 本身:

if (foo.isA(foo.B())){ //whatever } 

凡foo.B()返回一個類型FooBar的。

我知道這是一個通配符捕獲錯誤,並且需要一個助手,但我不知道如何設置一個。在'foo'被實例化的類中沒有任何方法,其中'foo'是一個參數,這是大多數幫助器似乎寫入的方式。 'foo'僅用於獲取FooBar對象,並測試FooBar對象。

任何幫助非常感謝,我希望我很清楚。謝謝!

+0

你能張貼FooImpl的代碼。所以我們知道您創建的實例是什麼。 –

回答

1

那麼最簡單的事情當然是在接口上添加一個便捷方法是:

public interface Foo<T extends Bar> { 
    boolean isA(T t); 
    T B(); 

    default boolean bIsA() { 
     return this.isA(this.B()); 
    } 
} 

總之,捕獲方法只是一個通用的方法與一類參數:

static <T extends Bar> boolean bIsA(Foo<T> foo) { 
    return foo.isA(foo.B()); 
} 

沒有比這更多的東西了。捕捉幫手的目的只是爲了獲得Foo<T>並做我們需要的任何事情。

然後:

if (Somewhere.bIsA(foo)) {...} 
+1

啊,我想我知道我該怎麼做。我看到我需要幾個輔助方法,每種方法都以這種方式調用接口。我只需要你的答案讓它點擊我。謝謝! – NeedsMoreCoffee