10

(バージョン3.1)で使用org.apache.commons.lang3.BooleanUtilsしています。commons-lang3次のコード行をコンパイルしようとすると

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

2 に答える 2

7

この問題は、メソッドのシグネチャに変数の引数があるために発生します。メソッドが呼び出されると、適用可能なすべてのメソッドが検索される 3 つのフェーズがあります。可変引数を持つメソッドは、ボックス化およびボックス化解除も許可されるフェーズ 3で検索されます。

したがって、ボクシングが考慮されているため、ここではxor(boolean...)との両方が適用されます。xor(Boolean...)複数のメソッドが適用可能な場合、最も具体的なメソッドのみが呼び出されます。しかし、この場合、booleanandBooleanを比較することはできないため、これ以上具体的な方法がないため、コンパイラ エラー: 両方の方法が一致します。

回避策は、明示的な配列を作成することです。

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;
}
于 2015-11-25T14:48:20.720 に答える
0

面白い : オートボクシングが思い通りに進まないコーナー ケース。

それを修正する最も簡単な方法は、書くことです

BooleanUtils.xor((boolean) true, (boolean) true)
于 2015-11-25T14:45:14.633 に答える