接口 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
1条答案
按热度按时间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表达式都是对象。