10

org.apache.commons.lang3.BooleanUtilscommons-lang3(3.1版)中使用。当我尝试编译下一行代码时

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...)在这里都适用,因为考虑了拳击。当多种方法适用时,仅调用最具体的方法。但是在这种情况下,booleanBoolean不能比较,所以没有更具体的方法,因此编译器错误:两个方法都匹配。

一种解决方法是创建一个显式数组:

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 回答