通用BiFunction作为参数

时间:2016-09-09 00:10:34

标签: java generics

我有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调用将该函数传递下去。

有没有办法保持函数的通用性,以便可以在两种方法中使用它?

1 个答案:

答案 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需要是同一个类!!!

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

相关问题