Я пишу Spring RowMapper, и у меня есть оператор switch, который проверяет каждую метку столбца.Когда метка совпадает, я получаю значение и устанавливаю его в своем возвращаемом объекте.
Если значение в столбце равно нулю, я не хочу инициализировать или устанавливать значение в моем возвращаемом объекте.
Я создал несколько вспомогательных функций для выполнения всего этого за одно действие:
@FunctionalInterface
interface CallSetter<P1, P2, C1, R>
{
public R exec(ResultSet rs, String columnLabel, Consumer<R> setter) throws SQLException;
}
Это прекрасно работает, когда я определяю свои различные типы следующим образом (один пример):
CallSetter<ResultSet, String, Consumer<String>, String> setStr = (rs, columnLabel, setter) ->
{
String val = rs.getString( columnLabel );
Boolean result = rs.wasNull();
if( result == false )
setter.accept( val );
return val;
};
Однако я действительно хочу, чтобы мой потребитель был анонимным в функциональном интерфейсе, но затем определил тип в моем определении, потому что я хочу, чтобы все мои методы setX возвращали логическое значение, а не значение.Другими словами, я хочу, чтобы Потребитель мог определять тип при реализации интерфейса, чтобы у меня были setStr, setDouble и т. Д.
Когда я пытаюсь это сделать (я только сейчас учусьJava 8, поэтому я не знаю, правильный ли это синтаксис для того, что я пытаюсь сделать):
@FunctionalInterface
interface CallSetter<P1, P2, C1, R>
{
public R exec(ResultSet rs, String columnLabel, Consumer<?> setter) throws SQLException;
}
Затем определите мои функции следующим образом:
CallSetter<ResultSet, String, Consumer<String>, String> setStr = (rs, columnLabel, setter) ->
{
String val = rs.getString( columnLabel );
Boolean setVal = rs.wasNull() == false;
if( setVal )
setter.accept( val );
return setVal;
};
Компилятор выдает ошибку:
Метод accept (capture # 1 of?) В типе Consumer не применим для аргументов (String).
Кажется, что я вынужден использовать один из тех же типов любого из моих параметров или возвращаемого типа (если я поставлю Consumer<R>
, он работает просто отлично, но я должен возвращать значение каждый раз).
Я искал этот сайт в Интернете, и я не могу найти никаких примеров этого.