2016-09-09 37 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的需要是同一类!

我想你可能需要重新考虑你的设计。