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 表达式都是一个对象。
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 表达式都是一个对象。