Java无法编译具有泛型参数和默认方法实现的函数接口

Java无法编译具有泛型参数和默认方法实现的函数接口,java,generics,lambda,Java,Generics,Lambda,我正在尝试扩展此接口: @functioninterface 公共接口句柄函数{ Mono句柄(ServerRequest请求); } 像这样: @functioninterface 公共接口HandlerFn扩展了handler函数{ 默认Mono句柄(服务器请求){ 返回手柄(请求); } 单手柄(R请求); } 我收到此错误(在handleFn(请求)): 类型HandlerFn中的方法handleFn(R)不适用于参数(ServerRequest) 在这个代码片段中,为什么在调用h

我正在尝试扩展此接口:

@functioninterface
公共接口句柄函数{
Mono句柄(ServerRequest请求);
}
像这样:

@functioninterface
公共接口HandlerFn扩展了handler函数{
默认Mono句柄(服务器请求){
返回手柄(请求);
}
单手柄(R请求);
}
我收到此错误(在
handleFn(请求)
):

类型HandlerFn中的方法handleFn(R)不适用于参数(ServerRequest)

在这个代码片段中,为什么在调用
handleFn(request)
时,类型
R
不会被推断为
ServerRequest

请求
ServerRequest
,而不是
R
R
可以是
ServerRequest
,但也可以是它的任何其他子类

R
在类上声明,而不是在方法上声明。
R
的类型是在声明对
HandlerFn
的引用时确定的,而不是在
handleFn
方法的调用站点

您可以在默认方法内强制转换:

return handleFn((R) request);
这是一个未经检查的强制转换(此时,它将在其他地方被检查)

如果将该方法声明为泛型方法,则它将在
句柄中工作:

<RR extends ServerRequest> Mono<ServerResponse> handleFn(RR request);
当然,与
handle
方法相比,它没有任何优势

<RR extends ServerRequest> Mono<ServerResponse> handleFn(RR request);
Mono<ServerResponse> handleFn(ServerRequest request);