2016-09-09 71 views
0

我有3個文件,有點像這樣:通用雙功能的參數

public class AConfig { 
    BConfig bConfig; //assume initialized 

    private B getA() { 
     return bConfig.getB(this::pickWhich); 
    } 

    public <T> Wrapper<T> pickWhich(T a, T b) { 
     //logic to decide whether to return a or b that doesn't actually use a or b 
     //store a or b in c 
     return new Wrapper<>(c); 
    } 
} 

public class BConfig { 
    CConfig cConfig; //assume initialized 
    B b1, b2; //assume initialized 

    public <T> B getB(BiFunction<T, T, Wrapper<T>> function) { 
     C c = cConfig.getC(function); 
     return createB(function.apply(b1, b2), c); 
    } 

    private B createB(Wrapper<B> b, C c) { 
     //... 
    } 
} 

public class CConfig { 
    C c1, c2; //assume initialized 

    public <T> C getC(BiFunction<T, T, Wrapper<T>> function) { 
     return createC(function.apply(c1, c2)); 
    } 

    public C createC(Wrapper<C> c) { 
      //... 
    } 
} 

我想要做的就是它,所以我可以傳承的功能和這兩種方法getB和GETC使用它,但我的申請得到括號錯誤說「申請(T,T)在BiFunction中不能應用於(B,B)「並且在getC中具有相同的錯誤,但是具有」(C,C)「。

我知道如果我改變getB到

public B getB(BiFunction<B, B, Wrapper<B>> function) { 
     C c = cConfig.getC(function); 
     return createB(function.apply(b1, b2), c); 
    } 

它會正常工作,但我無法通過GETC呼叫下傳功能。

有什麼辦法保持函數的通用性,以便它可以在兩種方法中使用?

+0

你可以添加的'''createB''聲明'和'''createC'''的問題? –

+0

此外代碼沒有反映出那些缺少局部變量(b1,b2,c1,c2)的類型,我猜他們是B和C,但你應該明確的。 –

+0

添加了更多上下文。 – Grantapher

回答

0

問題是createB需要輸入一個Wrapper<B>,但在當前代碼中唯一保證的是Wrapper<T>,其中T完全沒有約束(可以是任何東西)。

與createC一樣,它需要輸入BiFunction返回Wrapper<C>

所以問題是你是否可以構造一個BiFunction,同時有一個Wrapper和Wrapper返回。 如果T延伸,B和C(所以被聲明爲<T extends B & C>這似乎 來完成。

但是因爲你的意圖應用雙功能上的B和C的自變量t也需要B和C的晚飯。 ...所以最後T,B和C的需要是同一類!

我想你可能需要重新考慮你的設計。