【发布时间】:2016-05-03 23:02:31
【问题描述】:
我有一个函数式接口,可以将标准 jdk 函数扩展到简单的泛型类型。现在我想使用 andThen 组合两个函数,这会引发编译器错误
Error:(25, 25) java: method andThen in interface
java.util.function.Function<T,R>不能应用于给定类型;
必需:java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V>找到:ui.instrumentation.api.transformation.Transformer<T,R>原因: 无法推断类型变量 V (参数不匹配;ui.instrumentation.api.transformation.Transformer<T,R>不能 转换为java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V>)
这里是示例代码:
public interface Transformer<T,R> extends Function<Message<T>, Message<R>> {
static <T, R> Transformer<T, R> combine2(Transformer<T, R> first, Transformer<T, R> second) {
return first.andThen(second));
}
}
有没有一种方法可以组合扩展标准 Function 接口的函数,或者有更好的方法吗?
【问题讨论】:
-
为什么你需要
combine2函数,而andThen做同样的事情,对于更一般的参数类型Function? -
所以你想要一个函数,它接受一个
Message<T>,将它传递给first,得到一个Message<R>,然后以某种方式将Message<R>传递给second,即使second需要Message<T>而不是Message<R>。 -
我的建议:不要使用这样的扩展接口。以不允许使用基本接口的现有实现为代价(此处为
Function),您可以节省一些要输入的字母。因此,您需要重新实现所有内容,不仅andThen,甚至像Function.identity()这样的琐碎函数也不能用作Transformer。从别人的错误中吸取教训;尽管具有相同的功能签名,但您不能使用Transformer<T,T>,其中需要UnaryOperator<Message<T>>(另一个不允许基类型Function的示例)...
标签: java lambda functional-programming java-8