簡體   English   中英

Maven和apache utils的模糊編譯錯誤

[英]Ambiguous compilation error with Maven and apache utils

我在commons-lang3 (版本3.1)中使用org.apache.commons.lang3.BooleanUtils 當我嘗試編譯下一行代碼時

BooleanUtils.xor(true, true);

使用maven-compiler-plugin (版本3.3),我收到編譯失敗消息:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project exchange: Compilation failure
[ERROR] MyClass.java:[33,34] reference to xor is ambiguous, both method xor(boolean...) in org.apache.commons.lang3.BooleanUtils and method xor(java.lang.Boolean...) in org.apache.commons.lang3.BooleanUtils match

我使用Java 1.7.0_55進行編譯。

我怎么解決這個問題?

出現問題是因為方法的簽名具有可變參數。 調用方法時,有3個階段,在此階段中搜索所有適用的方法。 階段3中搜索具有可變參數的方法,其中還允許裝箱和取消裝箱。

所以xor(boolean...)xor(Boolean...)都適用於此,因為考慮了拳擊。 當多種方法適用時,僅調用最具體的方法。 但在這種情況下,無法比較booleanBoolean ,因此沒有更具體的方法,因此編譯器錯誤:兩種方法都匹配。

解決方法是創建顯式數組:

public static void main(String[] args) {
    xor(new boolean[] { true, false }); // will call the primitive xor
    xor(new Boolean[] { Boolean.TRUE, Boolean.FALSE }); // will call the non-primitive xor
}

private static Boolean xor(Boolean... booleans) {
    System.out.println("Boolean...");
    return Boolean.TRUE;
}

private static boolean xor(boolean... booleans) {
    System.out.println("boolean...");
    return true;
}

有趣的是:一個角落案例,其中autoboxing直接在你的方式。

解決這個問題的最簡單方法就是寫

BooleanUtils.xor((boolean) true, (boolean) true)

暫無
暫無

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

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