sak*_*029 5 java inheritance interface function java-8
我创建了一个GenericFunction实现Function和的类BiFunction.但它无法编译.
public class GenericFunction<T, U, R> implements
Function<T, R>, BiFunction<T, U, R> {
@Override
public R apply(T t, U u) {
return null;
}
@Override
public R apply(T t) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息是:
src\obscure\test\GenericFunction.java:6: error:
types BiFunction<T,U,R> and Function<T,R> are incompatible;
both define andThen(java.util.function.Function<? super R,? extends V>),
but with unrelated return types
public class GenericFunction<T, U, R> 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
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我不知道为什么你会想要这样的东西,但这似乎是一个有趣的挑战......
主要问题是Function和BiFunction都实现了一个默认andThen函数,两者都具有完全相同的签名,因此您的类不知道要调用哪个.你只需要提供自己的实现,然后它就不再含糊了.然而,实施是棘手的.
java文档说的方法:
返回首先将此函数应用于其输入的组合函数,然后将after函数应用于结果.
...这意味着返回一个新的GenericFunction,其中两个apply方法现在都是合成.
我给你这个怪物:
public class GenericFunction<T, U, R> implements Function<T, R>, BiFunction<T, U, R> {
@Override
public R apply(T t, U u) {
return null;
}
@Override
public R apply(T t) {
return null;
}
@Override
public <V> GenericFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
return new GenericFunctionAndThen<>(after);
}
private class GenericFunctionAndThen<V> extends GenericFunction<T, U, V> {
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这使用了我所知道的Java最晦涩的功能......我甚至不知道这个名字! ClassName.this如果方法被遮蔽,则在嵌套类中使用它来引用封闭实例中的方法(或字段).
从@ romacafe的答案延伸出来,我不喜欢的一件事就是GenericFunctionAndThen延伸GenericFunction而不重用其超类的任何行为 - 这看起来像是一种难闻的气味.
如果您GenericFunction将接口实现为接口,事情会更清晰:
public interface GenericFunction<T, U, R> extends Function<T, R>, BiFunction<T, U, R> {
@Override
default <V> GenericFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
return new GenericFunction<T, U, V>() {
@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));
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以简单地实现泛型行为(andThen方法),并且可以apply在不依赖继承的情况下在特定类中实现特定行为(2 种方法).
| 归档时间: |
|
| 查看次数: |
2879 次 |
| 最近记录: |