Функциональный интерфейс, который имеет Consumer с типом переменной - PullRequest
0 голосов
/ 04 марта 2019

Я пишу 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>, он работает просто отлично, но я должен возвращать значение каждый раз).

Я искал этот сайт в Интернете, и я не могу найти никаких примеров этого.

...