You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Jdbi封装异常处理时lambda表达式参数不匹配错误如何解决

错误原因

你自定义的JdbiCall函数式接口里,把泛型参数<R, X>声明在了call方法本身,Java的Lambda表达式不支持实现带泛型方法的函数式接口,编译器无法对这类泛型方法做Lambda的类型推导,因此直接抛出类型推断失败的错误。

正确实现

1. 调整JdbiCall接口定义

把泛型参数从方法级别移到接口级别:

@FunctionalInterface
private interface JdbiCall<R, X extends Exception> {
    R call() throws X;
}

2. 改写handleTransientExceptions方法

让方法泛型和JdbiCall的泛型绑定对应:

public <R, X extends Exception> R handleTransientExceptions(final JdbiCall<R, X> jdbiCall) throws X, MyCustomException {
    try {
        return jdbiCall.call();
    } catch (final JdbiException e) {
        if (DatabaseExceptionChecker.isTransientException(e)) {
            throw new MyCustomException("Transient database exception", e);
        }
        throw e;
    }
}

3. 调用方式无需修改

你之前期望的调用形式可以直接使用,编译器会自动完成泛型推导:

return handleTransientExceptions(() -> jdbi.withHandle(handle -> handle
        .createQuery("...")
        .mapTo(String.class)
        .one()));

内容的提问来源于stack exchange,提问作者rmf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:30:03