代码之家  ›  专栏  ›  技术社区  ›  Jack Flamp

测井通用方法

  •  2
  • Jack Flamp  · 技术社区  · 6 年前

    我想创建一个通用的日志记录方法,它可以根据 Predicate .

    这是日志方法(我把它们放在 map 供以后处理):

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

    我尝试如下使用它(我们有自己的日期类 DatumA ):

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

    ..在哪里 o1.getEndDate() 返回A 达塔马 具有方法的对象 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 回复  |  直到 6 年前
        1
  •  4
  •   Eran    6 年前

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

    但是,在 斯卡帕昆德马斯特 类, T 可以是任何东西(取决于如何实例化特定的 斯卡帕昆德马斯特 实例)。所以你不能通过 DatumA 实例,其中 t 是意料之中的事。

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

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

    在这种情况下, logIf(Predicate<T>, T, PersonId, String) 需要类型的参数 Predicate<String> , String , PersonId ,但您正在通过 Predicate<DatumA> 和A 达塔马 .

    如果希望该方法起作用,请考虑将类型参数移动到该方法(如果仍需要 t 类级别的参数)。

    例如:

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