[英]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...)
都適用於此,因為考慮了拳擊。 當多種方法適用時,僅調用最具體的方法。 但在這種情況下,無法比較boolean
和Boolean
,因此沒有更具體的方法,因此編譯器錯誤:兩種方法都匹配。
解決方法是創建顯式數組:
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.