2015-11-25 9 views
5

commons-lang3(バージョン3.1)のorg.apache.commons.lang3.BooleanUtilsを使用しています。私はコンパイルするためにJava 1.7.0_55を使用MavenとApacheのutilsであいまいなコンパイルエラー

[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 

:私はコード

maven-compiler-plugin(バージョン3.3)を使用して
BooleanUtils.xor(true, true); 

の次の行をコンパイルしようとする 、私はコンパイルエラーメッセージを取得しています。

どうすればこの問題を解決できますか?

答えて

4

を記述することです。メソッドが呼び出されると、適用可能なすべてのメソッドが検索される3つのフェーズがあります。可変引数を持つメソッドは、ボクシングとアンボクシングが許可されているphase 3で検索されます。

したがって、ボクシングを考慮に入れて、xor(boolean...)xor(Boolean...)の両方をここに適用できます。複数のメソッドが適用可能な場合は、最も固有のメソッドのみが呼び出されます。しかし、この場合はbooleanBooleanを比較することはできませんので、具体的な方法はなく、したがってコンパイラエラーです:両方のメソッドが一致します。実際に、それを書くための最も簡単な方法は、 `false`をある

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

この問題を回避するには、明示的な配列を作成することです。 – chrylis

+0

実際には、これはコンパイラエラーを解決しません。明示的なキャストでさえ、まだそこにある – Tunaki

+0

それは動作しません – Deplake

関連する問題