将组合函数转换为Function的子类

时间:2018-01-02 10:55:20

标签: java casting

这就是我想做的事情:

我希望有一个抽象类Operation实现Function接口,然后让类似OpA的子类继承它。 Operation是从FunctionInteger的{​​{1}},我希望能够使用IntegerFunction.compose撰写Function.andThen }秒。在代码中:

OpA

问题是,尽管public abstract class Operation implements Function<Integer, Integer> { // ... } public class OpA extends Operation { // ... } public class Main { public static void main(String[] args) { OpA a = new OpA(); OpA b = new OpA(); // vvv Problem here vvv Operation compose = (Operation) a.andThen(b); } } 是从a.andThen(b)Function的{​​{1}},但我无法将其转换为Integer。运行时抛出Integer

Operation

说实话,我并不是真的希望它能像那样开始工作,但出于我的目的,我真的需要组合函数为java.lang.ClassCastException。所以对于我的问题,我要求一种方法使函数组合返回一个与Caused by: java.lang.ClassCastException: java.util.function.Function$$Lambda$56/1571051291 cannot be cast to operation.Operation at application.Main.main(Main.java:25) 类型兼容的对象。任何有效的方法都很好:我愿意在必要的时候编写我自己的OperationOperation函数(但我不知道如何),尽管我们总是欢迎整齐的修复

1 个答案:

答案 0 :(得分:1)

如果您想要实现Sum,可以这样做:

static class Sum extends Operation {

    @Override
    public Integer apply(Integer x) {
        return x + 1;
    }

    public Operation andThen(Operation after) {
        return new Operation() {
            @Override
            public Integer apply(Integer x) {
                return after.apply(Sum.this.apply(x));
            }
        };
    }
}

致电:

Sum a = new Sum();
Sum b = new Sum();

Operation composed = a.andThen(b);
System.out.println(composed.apply(2)); // 4