Apache Log4j 不明确的重载方法

Apache Log4j Ambiguous Overloaded Method

Apache Log4j 2.12.1 中的接口 org.apache.logging.log4j.Logger 有以下 2 个方法:

void info(String message, Object... params);

void info(String message, Supplier<?>... paramSuppliers);

在我的代码中,我的意图是调用第二个方法,第二个 arg 是 lambda paramSupplier。令人惊讶的是,在运行时,第一个方法被调用,它打印了 lambda 的 obj 引用而不是实际的参数值。

我很困惑为什么这些方法没有被编译器标记为不明确。这是在 Java 11 上。我还看到许多其他方法,在同一个 Logger 接口中,方法签名的区别只是一个方法采用 Object 而另一个方法采用a Supplier<?> 在 args 列表中的相同位置,所有其他方法 args 的类型和顺序匹配。

我在 re: overloaded methods disambiguation 中找到了以下两个问题,但这些答案似乎没有解释这一点。

根据您的描述,我可以假设问题出在 Supplier 接口的错误包名称中,因为我们使用的规则是 java.util.function.Supplier,但 org.apache.logging.log4j.Logger 接口需要 Supplier 接口来自 org.apache.logging.log4j.util.Supplier 包,更改包名后将调用第二个方法。

如果一切都像我上面说的那样,歧义的问题很简单,第二个方法的签名不匹配并且void info(String message, Object... params);方法将被调用作为参数类型不匹配的默认方法,因为任何[= Java 中的 22=] 已扩展 Object class 并且任何 lambda 表达式都是一个对象。