2015-11-25 18 views
5

Ich verwende org.apache.commons.lang3.BooleanUtils in der commons-lang3 (Version 3.1). Wenn ich versuche nächste Zeile Code zu kompilierenMehrdeutiger Kompilierungsfehler mit Maven und Apache utils

BooleanUtils.xor(true, true); 

mit maven-compiler-plugin (Version 3.3), ich bin eine Compilation Fehlermeldung erhalten:

[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 

Ich benutze Java 1.7.0_55 zu kompilieren.

Wie kann ich das lösen?

Antwort

4

Das Problem tritt auf schreiben, weil die Signatur der Methode Variable Argumente hat. Wenn eine Methode aufgerufen wird, gibt es 3 Phasen, in denen alle anwendbaren Methoden gesucht werden. Methoden mit variablen Argumenten werden in phase 3 gesucht, wobei Boxen und Unboxing ebenfalls zulässig sind.

Also beide xor(boolean...) und xor(Boolean...) sind hier anwendbar, weil Boxen berücksichtigt wird. Wenn mehrere Methoden anwendbar sind, wird nur das spezifischste aufgerufen. Aber in diesem Fall können boolean und nicht verglichen werden, so gibt es keine spezifischere Methode, daher der Compiler-Fehler: beide Methoden übereinstimmen.

Eine Abhilfe ist eine explizite Array zu erstellen:

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

Das funktioniert, aber für mich sieht es aus wie wirklich schlechter Code :) Ich war überrascht, dass dies in der apcahe-commons-lengs3 passieren kann – Deplake

0

Lustig: ein Eckgehäuse, bei dem Autoboxen direkt in Ihre Richtung gehen.

Der einfachste Weg, dies zu beheben, ist

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

Eigentlich ist der einfachste Weg, es zu schreiben ist 'false'. – chrylis

+0

Tatsächlich löst dies den Compilerfehler nicht. Es ist immer noch da, sogar mit der expliziten Besetzung – Tunaki

+0

Es funktioniert nicht – Deplake