[英]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.