我想创建一个通用的日志记录方法,它可以采用任何类型并根据谓词
进行日志记录。
这是日志方法(我将它们放在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
, 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);
}
}
关于java - 日志记录的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50696062/