当前位置:  开发笔记 > 编程语言 > 正文

如何同时实现Function和BiFunction?

如何解决《如何同时实现Function和BiFunction?》经验,为你挑选了2个好方法。

我创建了一个GenericFunction实现Function和的类BiFunction.但它无法编译.

public class GenericFunction implements
        Function, BiFunction {

    @Override
    public R apply(T t, U u) {
        return null;
    }

    @Override
    public R apply(T t) {
        return null;
    }

}

错误消息是:

src\obscure\test\GenericFunction.java:6: error:
types BiFunction and Function are incompatible;
both define andThen(java.util.function.Function),
but with unrelated return types
public class GenericFunction implements
       ^
where T,U,R are type-variables:
  T extends Object declared in class GenericFunction
  U extends Object declared in class GenericFunction
  R extends Object declared in class GenericFunction

1 error

我怎样才能做到这一点?



1> romacafe..:

我不知道为什么你会想要这样的东西,但这似乎是一个有趣的挑战......

主要问题是Function和BiFunction都实现了一个默认andThen函数,两者都具有完全相同的签名,因此您的类不知道要调用哪个.你只需要提供自己的实现,然后它就不再含糊了.然而,实施是棘手的.

java文档说的方法:

返回首先将此函数应用于其输入的组合函数,然后将after函数应用于结果.

...这意味着返回一个新的GenericFunction,其中两个apply方法现在都是合成.

我给你这个怪物:

public class GenericFunction implements Function, BiFunction {

    @Override
    public R apply(T t, U u) {
        return null;
    }

    @Override
    public R apply(T t) {
        return null;
    }

    @Override
    public  GenericFunction  andThen(Function after) {
        return new GenericFunctionAndThen<>(after);
    }

    private class GenericFunctionAndThen extends GenericFunction {
        private final Function after;

        public GenericFunctionAndThen(Function after) {
            this.after = after;
        }

        @Override
        public V apply(T t) {
            return after.apply(GenericFunction.this.apply(t));
        }

        @Override
        public V apply(T t, U u) {
            return after.apply(GenericFunction.this.apply(t, u));
        }
    }
}

这使用了我所知道的Java最晦涩的功能......我甚至不知道这个名字! ClassName.this如果方法被遮蔽,则在嵌套类中使用它来引用封闭实例中的方法(或字段).


当然!这是我在很长一段时间内写过的最疯狂的Java,也许永远都是.它仍然干净但也坚果.你在写一个Lisp解释器吗?你听说过Clojure,对吗?:)

2> Didier L..:

从@ romacafe的答案延伸出来,我不喜欢的一件事就是GenericFunctionAndThen延伸GenericFunction而不重用其超类的任何行为 - 这看起来像是一种难闻的气味.

如果您GenericFunction将接口实现为接口,事情会更清晰:

public interface GenericFunction extends Function, BiFunction {
    @Override
    default  GenericFunction andThen(Function after) {
        return new GenericFunction() {
            @Override
            public V apply(final T t, final U u) {
                return after.apply(GenericFunction.this.apply(t, u));
            }

            @Override
            public V apply(final T t) {
                return after.apply(GenericFunction.this.apply(t));
            }
        };
    }
}

通过这种方式,您可以简单地实现泛型行为(andThen方法),并且可以apply在不依赖继承的情况下在特定类中实现特定行为(2 种方法).

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有