Maven和apache utils的模糊编译错误

Dep*_*ake 9 java apache apache-commons maven apache-commons-lang3

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

BooleanUtils.xor(true, true);
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

我使用Java 1.7.0_55进行编译.

我怎么解决这个问题?

Tun*_*aki 7

出现问题是因为方法的签名具有可变参数.调用方法时,有3个阶段,在此阶段中搜索所有适用的方法.在阶段3中搜索具有可变参数的方法,其中还允许装箱和取消装箱.

因此,无论xor(boolean...)并且xor(Boolean...)因为拳击是考虑到在这里都适用.当多种方法适用时,仅调用最具体的方法.但是在这种情况下,boolean并且Boolean无法进行比较,因此没有更具体的方法,因此编译错误:两种方法都匹配.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但对我来说看起来真的很糟糕的代码:)我很惊讶,这可能发生在apcahe-commons-lengs3 (2认同)