Общий метод регистрации - PullRequest
0 голосов
/ 05 июня 2018

Я хочу создать универсальный метод для ведения журнала, который может принимать любой тип и запись в зависимости от Predicate.

Это метод ведения журнала (я поместил их в map для последующей обработки):

private void logIf(Predicate<T> p, T t, PersonId id, String message) {
    if (p.test(t)) {
        logMap.put(id, message);
    }
}

Я пытаюсь использовать его следующим образом (у нас есть собственный класс Date с именем DatumA):

logIf(d -> d.nollKoll(), o1.getEndDate(), id, "Datum contains year, month or day with value 0.");

.. где o1.getEndDate() возвращает DatumA объект с методом nollKoll(), который возвращает boolean.

Компилятор жалуется:

The method logIf(Predicate<T>, T, PersonId, String) in the type
SkapaKundMasterData<T> is not applicable for the arguments
(Predicate<T>, DatumA, PersonId, String)

Как я могу заставить эту работу работать?

1 Ответ

0 голосов
/ 05 июня 2018

Поскольку ваш метод logIf равен private, вы должны вызывать его из того же класса (SkapaKundMasterData).

Однако в пределах класса SkapaKundMasterData, T может бытьчто угодно (в зависимости от того, как вы создаете конкретный экземпляр SkapaKundMasterData).Поэтому вы не можете передать экземпляр DatumA, где ожидается T.

Предположим, например, что вы создаете экземпляр:

SkapaKundMasterData<String> instance = new SkapaKundMasterData<>();

В этом случае logIf(Predicate<T>, T, PersonId, String) потребуются аргументы типов Predicate<String>, String, PersonId и String, но вы передаете Predicate<DatumA> и DatumA.

Если вы хотите, чтобы метод работалрассмотрите возможность перемещения параметра типа в метод (или добавление нового параметра типа, если вам все еще нужен параметр T на уровне класса).

Например:

private <S> void logIf(Predicate<S> p, S t, PersonId id, String message) {
    if (p.test(t)) {
        logMap.put(id, message);
    }
}
...