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
相关产品推荐
相关产品推荐

