[英]Apache Log4j Ambiguous Overloaded Method
The interface org.apache.logging.log4j.Logger
in Apache Log4j 2.12.1 has the following 2 methods:
void info(String message, Object... params);
void info(String message, Supplier<?>... paramSuppliers);
在我的代码中,我的意图是调用第二种方法,而第二个参数是 lambda paramSupplier。 令人惊讶的是,在运行时,第一个方法被调用,它打印了 lambda 的 obj 引用而不是实际的参数值。
我很困惑为什么这些方法没有被编译器标记为模棱两可。 这是在 Java 11 上。我还在同一个Logger
界面中看到了许多其他方法,其中方法签名的区别只是一种方法采用Object
而另一种方法采用Supplier<?>
在同一个 Z4757FE07FDDDE682A 中列表,与所有其他方法参数匹配的类型和顺序。
我发现了以下两个问题:重载方法消歧,但这些答案似乎并没有解释这一点。
By your description, I can suppose that issue is in incorrect package name for Supplier
interface, as rule we are using java.util.function.Supplier
, but org.apache.logging.log4j.Logger
interface expects Supplier
interface from org.apache.logging.log4j.util.Supplier
package,更改package名称后会调用第二种方法。
如果一切如我上面所说,歧义的问题很简单,签名与第二种方法不匹配并且void info(String message, Object... params);
method will be called as default for unmatched types of parameters, because any class in Java has been extended by Object
class and any lambda expression is an object.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.