java - 日志记录的通用方法

标签 java generics java-8 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)

我怎样才能做到这一点?

最佳答案

自从您的 logIf方法是private ,您必须从同一个类中调用它 ( SkapaKundMasterData )。

但是,在 SkapaKundMasterData 范围内类,T可以是任何东西(取决于您实例化特定 SkapaKundMasterData 实例的方式)。因此你不能通过 DatumA实例其中 T预计。

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

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

在这种情况下,logIf(Predicate<T>, T, PersonId, String)需要 Predicate<String> 类型的参数, String , PersonIdString ,但您正在传递 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);
    }
}

关于java - 日志记录的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50696062/

相关文章:

java - GAE 应用程序将 Long 序列化为字符串。如何改变呢?

java - 如何调整ScrollView中的Banner广告

java - Math.cos() 给出错误的结果

java - 访问参数化类型的参数化类型

java - 在 arrayList 的 arrayList 中分组

Java 集合类型参数到数组

Java SAX 解析

java - IntelliJ IDEA 中的 JUnit 测试问题 - 找不到类

java - Guava TypeToken 和泛型类

haskell - 为什么 zip 在参数计数方面不是通用的?