我有一个函数接口,它将标准的jdk函数扩展到简单的泛型类型。现在我想使用andThen组合两个函数,这是抛出编译器错误。
错误:(25,25) java:接口
java.util.function.Function<T,R>
中的方法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));
}
}
是否有一种方法来组合扩展标准函数接口的函数,或者有更好的方法来实现这一点?
发布于 2016-05-03 23:13:56
您需要同时修复您的泛型,与其使用只返回一个andThen
的Function
,不如自己插入lambda:
static <T1, T2, T3> Transformer<T1, T3> combine2(Transformer<T1, T2> first, Transformer<T2, T3> second) {
return (Message<T1> input) -> second.apply(first.apply(input));
}
发布于 2016-05-04 00:04:31
第一个问题是,andThen
获取一个函数的返回值,并使下一个函数的参数类型成为下一个函数的参数类型,因此,正如@LouisWasserman所解释的那样,需要将它们端到端地链接到一个匹配下一个输入类型的输出类型:
static <T1, T2, T3> Transformer<T1, T3> combine2(Transformer<T1, T2> first, Transformer<T2, T3> second) {
正如他还解释的那样,第二个问题是您正在调用的Function.andThen
返回的是一个Function
,而不是一个Transformer
。但是,请注意,Function
和Transformer
具有相同的形状--单输入、单输出。正因为如此,您可以使用其中一个,然后使用如下方法引用将其修改为另一个:
static <T1, T2, T3> Transformer<T1, T3> combine(Transformer<T1, T2> first, Transformer<T2, T3> second) {
return first.andThen(second)::apply;
}
您不需要创建一个函数就可以做到这一点。您可以使用同样的技术直接调用Function.andThen()
:
Transformer<String,Integer> t1 = ...
Transformer<Integer,Double> t2 = ...
Transformer<Double,String> t3 = ...
Transformer<String,String> t123 = t1.andThen(t2).andThen(t3)::apply;
https://stackoverflow.com/questions/37015799
复制相似问题