2015-11-25 14 views
5

Sto utilizzando org.apache.commons.lang3.BooleanUtils nello commons-lang3 (versione 3.1). Quando provo a compilare riga successiva di codiceErrore di compilazione ambiguo con utilità Maven e apache

BooleanUtils.xor(true, true); 

utilizzando maven-compiler-plugin (versione 3.3), sto diventando una compilation messaggio di errore:

[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 

Io uso Java 1.7.0_55 per la compilazione.

Come posso risolvere questo?

risposta

4

Il problema si verifica perché la firma del metodo ha argomenti variabili. Quando viene invocato un metodo, ci sono 3 fasi durante le quali vengono cercati tutti i metodi applicabili. I metodi con argomenti variabili vengono ricercati in phase 3 in cui è consentito anche il boxing e l'unboxing.

Quindi sia xor(boolean...) sia xor(Boolean...) sono applicabili qui perché la boxe viene presa in considerazione. Quando sono applicabili più metodi, viene invocato solo il più specifico. Ma in questo caso, boolean e Boolean non possono essere confrontati, quindi non esiste un metodo più specifico, quindi l'errore del compilatore: entrambi i metodi corrispondono.

Una soluzione è quella di creare un array esplicito:

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

Questo funziona, ma per me sembra un codice veramente pessimo :) Ero sorpreso che questo potesse accadere nell'apcahe-commons-lengs3 – Deplake

0

Divertente: un caso angolare in cui l'autoboxing va dritto sulla tua strada.

Il modo più semplice per risolvere questo è quello di scrivere

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

In realtà, il modo più semplice per scriverlo è 'false'. – chrylis

+0

In realtà, questo non risolve l'errore del compilatore. È ancora lì, anche con il cast esplicito – Tunaki

+0

Non funziona – Deplake