查看方法的签名并尝试判断确切的返回类型是什么:
static <P, Q, H extends Finder<P, Q>> H condition3(…
Lambda 只能实现一个interface
在编译时已知。但实际的类型参数H
编译器不知道。
您的第一个方法有效,因为它返回类型Finder<P, Q>
lambda 可以实现,你的第二个可以工作,因为它不使用 lambda 来实现返回类型H extends Finder<P, Q>
.
只有第三个方法尝试为类型参数指定 lambda 表达式H extends Finder<P, Q>
.
解决方案是不让调用者自由地强制执行特定的子类型Finder
作为方法的返回类型:
static <P, Q, H extends Finder<P, Q>>
Finder<P, Q> condition3(Pair<Predicate<P>, H>... hs) {
为了说明原始方法签名的含义,请查看以下示例:
final class HImpl implements Finder<String,String> {
public Stream<String> findBest(String t) {
return null; // just for illustration, we never really use the class
}
}
…
HImpl x=Finder.<String,String,HImpl>condition3();
考虑到您的原始方法签名,该编译不会出现任何错误。但方法应该怎样condition3
提供一个实例HImpl
这里使用你的 lambda 表达式?