我有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两个方法中使用它,但是我在apply括号中得到错误说&#34; apply(T,T )在BiFunction中不能应用于(B,B)&#34;和getC中的相同错误,但与&#34;(C,C)&#34;。
我知道如果将getB更改为
public B getB(BiFunction<B, B, Wrapper<B>> function) {
C c = cConfig.getC(function);
return createB(function.apply(b1, b2), c);
}
它可以正常工作,但我无法通过getC调用将该函数传递下去。
有没有办法保持函数的通用性,以便可以在两种方法中使用它?
答案 0 :(得分:0)
问题是createB
需要Wrapper<B>
作为输入,但当前代码中唯一保证的是Wrapper<T>
,其中T完全未绑定(可以是任何东西)。
与createC相同,输入BiFunction需要返回Wrapper<C>
。
所以问题是你是否可以构造一个同时具有Wrapper和Wrapper返回的BiFunction。
如果T扩展B和C(因此声明为<T extends B & C>
这似乎是
完成。
然而,既然你打算在B和C参数上应用BiFunction,那么T也需要是B和C的晚餐....所以最后T,B和C需要是同一个类!!!
我想你可能需要重新考虑你的设计。