簡體   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