apachelog4j方法

ve7v8dk2  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(275)

接口 org.apache.logging.log4j.Logger 在apache log4j 2.12.1中,有以下两种方法:

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

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

在我的代码中,我的意图是调用第二个方法,第二个参数是lambda参数。令人惊讶的是,在运行时调用了第一个方法,它打印lambda的obj引用,而不是实际的param值。
我很困惑为什么这些方法没有被编译器标记为不明确的。这是在Java11上。我也看到许多其他方法,同样的 Logger 接口,其中方法签名的区别只是一个方法采用 Object 另一种方法需要 Supplier<?> 在args列表中的相同位置,与所有其他方法args的类型和顺序匹配。
我发现了以下两个问题:重载方法消歧,但这些答案似乎不能解释这一点。
使用泛型和lambda重载方法时方法调用不明确
(java 8)java.util.function.supplier

ffscu2ro

ffscu2ro1#

根据您的描述,我可以假设问题的包名不正确 Supplier 接口,作为我们使用的规则 java.util.function.Supplier ,但是 org.apache.logging.log4j.Logger 接口期望 Supplier 接口来自 org.apache.logging.log4j.util.Supplier 包,更改包名称后将调用第二个方法。
如果一切都如我上面所说,那么歧义的问题很简单,签名与第二种方法和 void info(String message, Object... params); 对于不匹配的参数类型,方法将作为默认值调用,因为java中的任何类都已由 Object 类,任何lambda表达式都是对象。

相关问题