Java 8 lambda 和抽象类的接口扩展

2024-05-19

说我想宣布Spring的RowMapper,但不是创建动态类,而是实现一个实现 RowMapper 的抽象类。这是我的方法签名:

SqlProcedure#declareRowMapper(RowMapper<?> rowMapper);

CustomRowMapper.java:

public abstract class CustomRowMapper<T> implements RowMapper<T> {
    protected A a = new A();
}

旧的 Java 方式是这样写:

sqlProc.declareRowMapper(new CustomRowMapper<Object>() {
    @Override
    public Object mapRow(ResultSet rs, int rowNum) {
        a.doSomething(rs, rowNum);
        return new Object();
    }
});

用 lambda 表达式可以达到同样的效果吗?我想做这样的事情:

sqlProc.declareRowMapper((rs, rowNum) -> {
    a.doSomething(rs, rowNum);
    return new Object();
});

但然后我会得到一个编译错误说a cannot be resolved。这是因为 Java 将此视为RowMapper#mapRow方法,不CustomRowMapper#mapRow.

如何通过 lambda 表达式告诉 Java 使用自定义 RowMapper 而不是 RowMapper?这可能吗?


Lambda 无法实现抽象类。这就是为什么 http://www.techempower.com/blog/2013/03/26/everything-about-java-8/.

本文中提到了解决方法,但当您尝试引用对象字段时,它在您的情况下不起作用。除了坚持使用老式的匿名类之外,你能做的就是思考如何将 A“注入”到 lamda 中,例如:

  • 在 lambda 中实例化一个对象;
  • 在 lambda 范围之外创建 A;
  • 制作某种单音。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 lambda 和抽象类的接口扩展 的相关文章

随机推荐