繁体   English   中英

Apache Log4j 模糊重载方法

[英]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 中列表,与所有其他方法参数匹配的类型和顺序。

我发现了以下两个问题:重载方法消歧,但这些答案似乎并没有解释这一点。

  1. 使用 generics 和 lambda 重载方法时不明确的方法调用
  2. (Java 8) java.util.function.Supplier

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM