【问题标题】:Java failed to compile Functional Interface with generic parameter and default method implementationJava 无法编译具有泛型参数和默认方法实现的功能接口
【发布时间】:2020-06-14 17:11:14
【问题描述】:

我正在尝试扩展这个接口:

@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {
    Mono<T> handle(ServerRequest request);
}

像这样:

@FunctionalInterface
public interface HandlerFn<R extends ServerRequest> extends HandlerFunction<ServerResponse> {
    default Mono<ServerResponse> handle(ServerRequest request) {
        return handleFn(request);
    }

    Mono<ServerResponse> handleFn(R request);
}

我收到了这个错误(handleFn(request)):

The method handleFn(R) in the type HandlerFn<R> is not applicable for the arguments (ServerRequest)

在这段代码sn-p中,为什么在调用handleFn(request)时,类型R没有被推断为ServerRequest

【问题讨论】:

    标签: java generics lambda


    【解决方案1】:

    requestServerRequest,而不是 RR 可以ServerRequest,但也可以是它的任何其他子类。

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

    您可以在默认方法中进行强制转换:

    return handleFn((R) request);
    

    这是一个未经检查的演员表(此时;它将在其他地方检查)。

    如果您将该方法声明为泛型方法,它将在handle 中工作:

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

    (你不需要在接口上使用R。我只是将其称为RR,以强调它是一个单独的类型变量)。

    但是,事实上,这样的类型变量没有任何意义:与非泛型声明方法相比,这没有任何优势:

    Mono<ServerResponse> handleFn(ServerRequest request);
    

    当然,与handle 方法相比没有优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多