2015-11-25 2 views
5

Я использую org.apache.commons.lang3.BooleanUtils в commons-lang3 (версия 3.1). Когда я пытаюсь скомпилировать следующую строку кодаНеоднозначная ошибка компиляции с Maven и apache utils

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 для компиляции.

Как я могу это решить?

ответ

4

Проблема происходит потому, что подпись метода имеет переменные аргументы. Когда вызывается метод, есть три фазы, в течение которых выполняется поиск всех применимых методов. Обыскиваются методы с переменными аргументами в phase 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; 
} 
+0

Это работает, но для меня выглядит действительно плохой код :) Я был удивлен, что это может произойти в apcahe-commons-lengs3 – Deplake

0

Забавный: угловой футляр, где автобоксинг идет прямо на вашем пути.

Самый простой способ исправить это, чтобы написать

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

На самом деле, самый простой способ, чтобы написать это 'false'. – chrylis

+0

На самом деле это не решает проблему с компилятором. Он все еще там, даже с явным литом – Tunaki

+0

Это не работает – Deplake