2015-11-25 38 views
5

Używam org.apache.commons.lang3.BooleanUtils w commons-lang3 (wersja 3.1). Kiedy próbuję skompilować następny wiersz koduNiejednoznaczny błąd kompilacji przy użyciu Maven i apache utils

BooleanUtils.xor(true, true); 

korzystając maven-compiler-plugin (wersja 3.3), Dostaję komunikat o niepowodzeniu kompilacji:

[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 

używam Java 1.7.0_55 skompilować.

Jak mogę to rozwiązać?

Odpowiedz

4

Problem dzieje, ponieważ podpis metody ma zmienne argumentów. Kiedy wywoływana jest metoda, istnieją 3 fazy, podczas których wyszukiwane są wszystkie odpowiednie metody. Metody ze zmiennymi argumentami są przeszukiwane w phase 3, gdzie dozwolone jest także boksowanie i rozpakowywanie.

Tak więc zarówno xor(boolean...), jak i xor(Boolean...) mają tu zastosowanie, ponieważ brane są pod uwagę boks. Gdy stosuje się wiele metod, wywoływana jest tylko najbardziej szczegółowa. Ale w tym przypadku, boolean i Boolean nie mogą być porównywane, więc nie ma bardziej określonej metody, stąd błąd kompilatora: obie metody są zgodne.

Rozwiązaniem jest stworzenie wyraźnej tablicy:

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

To działa, ale dla mnie wygląda na naprawdę zły kod :) Byłem zaskoczony, że to może się zdarzyć w apcahe-commons-lengs3 – Deplake

0

Zabawne: narożny przypadek, w którym autoboxing idzie wprost na twoją drogę.

Najprostszym sposobem, aby naprawić to napisać

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

Właściwie, to najprostszy sposób, aby ją napisać to 'FALSE. – chrylis

+0

W rzeczywistości nie rozwiązuje to błędu kompilatora. To wciąż tam jest, nawet z wyraźną obsadą – Tunaki

+0

To nie działa – Deplake