我想编写一个函数工厂,它应该是一个函数,一次调用并传入不同的策略作为参数。它应该返回一个函数,根据要由谓词满足的参数选择其中之一的策略。
更好地理解,请参考
那么问题是什么?我能解决它吗?如果可以用Java解决,怎么做呢?
condition3
。
问题在于它无法编译。我认为这是因为编译器无法确定可以通过实现来实现函数接口H
。
没有泛型时,它可以正常工作。@FunctionalInterface
public interface Finder<T, S> {
Stream<S> findBest (T t);
// Valid code
static <P, Q> Finder<P, Q> condition1 () {
return p -> null;
}
// Valid code, but selects just one of the H's when the method is invoked
static <P, Q, H extends Finder<P, Q>> H condition2 (Pair<Predicate<P>, H>... hs) {
return hs[0].getRight ();
}
// Should return a method, which selects the appropiate H
// whenever it is invoked with an P
// Compiler complain:
// The target type of this expression must be a functional interface
static <P, Q, H extends Finder<P, Q>> H condition3 (Pair<Predicate<P>, H>... hs) {
return p -> stream (hs).filter (pair -> pair.getLeft ().test (p))
.findFirst ()
.map (Pair::getRight)
.map (h -> h.findBest (p))
.orElseGet (Stream::empty);
}
}
那么问题是什么?我能解决它吗?如果可以用Java解决,怎么做呢?