记录的通用方法

Generic method for logging

我想创建一个通用的日志记录方法,它可以采用任何类型并根据 Predicate 进行记录。

这是日志方法(我把它们放在一个map中,以便稍后处理):

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

我正在尝试按如下方式使用它(我们有自己的日期 class 称为 DatumA):

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

..where o1.getEndDate() returns a DatumA object which has the method nollKoll() which returns a 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)

我怎样才能使这个工作?

由于您的 logIf 方法是 private,您必须从同一个 class (SkapaKundMasterData).

中调用它

但是,在 SkapaKundMasterData class 中,T 可以是任何东西(取决于您如何实例化特定的 SkapaKundMasterData 实例)。因此,您不能在预期 T 的地方传递 DatumA 实例。

例如,假设您创建了一个实例:

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

在这种情况下,logIf(Predicate<T>, T, PersonId, String) 需要 Predicate<String>StringPersonIdString 类型的参数,但您传递的是 Predicate<DatumA>DatumA.

如果您希望该方法起作用,请考虑将类型参数移动到方法中(或者如果您仍然需要 class 级别的 T 参数,则添加一个新的类型参数)。

例如:

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