我创建了一个GenericFunction
实现Function
和的类BiFunction
.但它无法编译.
public class GenericFunctionimplements 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 BiFunctionand Function are incompatible; both define andThen(java.util.function.Function super R,? extends V>), 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
我怎样才能做到这一点?
我不知道为什么你会想要这样的东西,但这似乎是一个有趣的挑战......
主要问题是Function和BiFunction都实现了一个默认andThen
函数,两者都具有完全相同的签名,因此您的类不知道要调用哪个.你只需要提供自己的实现,然后它就不再含糊了.然而,实施是棘手的.
java文档说的方法:
返回首先将此函数应用于其输入的组合函数,然后将after函数应用于结果.
...这意味着返回一个新的GenericFunction,其中两个apply方法现在都是合成.
我给你这个怪物:
public class GenericFunctionimplements 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 super R, ? extends V> after) { return new GenericFunctionAndThen<>(after); } private class GenericFunctionAndThen extends GenericFunction { private final Function super R, ? extends V> after; public GenericFunctionAndThen(Function super R, ? extends V> 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
如果方法被遮蔽,则在嵌套类中使用它来引用封闭实例中的方法(或字段).
从@ romacafe的答案延伸出来,我不喜欢的一件事就是GenericFunctionAndThen
延伸GenericFunction
而不重用其超类的任何行为 - 这看起来像是一种难闻的气味.
如果您GenericFunction
将接口实现为接口,事情会更清晰:
public interface GenericFunctionextends Function , BiFunction { @Override default GenericFunction andThen(Function super R, ? extends V> 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 种方法).