Скажем, я хочу объявить 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();
}
});
Можно ли добиться того же с помощью лямбда-выражений? Я хотел бы сделать что-то вроде этого:
sqlProc.declareRowMapper((rs, rowNum) -> {
a.doSomething(rs, rowNum);
return new Object();
});
Но тогда я получил бы ошибку компиляции, говорящую a cannot be resolved. Это потому, что Java рассматривает это как реализацию метода RowMapper#mapRow, а не CustomRowMapper#mapRow.
Как указать Java использовать мой CustomRowMapper вместо RowMapper с помощью лямбда-выражений? Это вообще возможно?