簡體   English   中英

如何使用Apache Commons BooleanUtils.and方法?

[英]How to use apache commons BooleanUtils.and method?

Apache commons-lang有兩個重載的BooleanUtils.and方法。

public static boolean and(final boolean... array) {

public static Boolean and(final Boolean... array) {

調用BooleanUtils.and方法時,將引發模棱兩可的方法調用錯誤。

java: reference to and is ambiguous
  both method and(boolean...) in org.apache.commons.lang3.BooleanUtils and method and(java.lang.Boolean...) in org.apache.commons.lang3.BooleanUtils match

可以使用以下語法來調用它。

BooleanUtils.and(new Boolean[]{Boolean.TRUE, Boolean.TRUE});

但是,根據方法的javadoc,用法細節有所不同。

Java文檔

文字布爾值

包裝布爾值

調用BooleanUtils.and的有效方法

這是因為重載varargs方法不適用於原始類型及其對象包裝器類型 apache-commons-lang3沒什么可怪的。

varags如何工作?

在編譯期間,將varags方法簽名替換為Array 在這里, BooleanUtils.and方法將轉換為

public static boolean and(final boolean[] array) { ... 
}

public static boolean and(final boolean[] array) { ... 
}

傳遞給它們的參數將替換為Array 在這種情況下,您會得到這個

BooleanUtils.and(new boolean[]{true, true}) 
BooleanUtils.and(new Boolean[]{Boolean.TRUE, Boolean.TRUE})

為什么調用歧義方法?

您會發現您轉換后的方法參數是Array類型,並且兩個方法都與此類型相匹配。 因此,編譯器本身發現哪一個都不比另一個更合適。 它無法確定哪個方法是最特定的調用。

但是,當您自己聲明BooleanUtils.and(new Boolean[]{Boolean.TRUE, Boolean.TRUE})BooleanUtils.and(new boolean[]{true, true}) ,無需編譯即可選擇暴露給編譯器和方法的意圖或自動裝箱。

這就是編譯器在三個階段中確定適用方法的方式。 查看有關選擇最具體方法的詳細信息

第一階段(第15.12.2.2節)執行重載解析, 而不允許裝箱或拆箱轉換 ,也不允許使用可變arity方法調用。 如果在此階段未找到適用的方法,則處理將繼續進行到第二階段。

第二階段(第15.12.2.3節) 在允許裝箱和拆箱的同時執行重載解析,但仍排除使用可變arity方法調用。 如果在此階段未找到適用的方法,則處理將繼續進行到第三階段。

第三階段(第15.12.2.4節)允許將重載與可變arity方法,裝箱和拆箱相結合。

這種編譯錯誤出現在JDK8中。 我相信,commons-lang的javadoc是以前編寫的。 (當JDK7是最新的SDK時)。 似乎,這是JDK8(可能是lambas )發布的功能之一的lambas

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM