如何使用apache commons BooleanUtils.and method?

2022-09-04 04:27:36

Apache commons-lang有两个重载方法。BooleanUtils.and

public static boolean and(final boolean... array) {

public static Boolean and(final Boolean... array) {

调用方法时,会引发不明确的方法调用错误。BooleanUtils.and

java: reference to and is ambiguous
  both method and(boolean...) in org.apache.commons.lang3.BooleanUtils and method and(java.lang.Boolean...) in org.apache.commons.lang3.BooleanUtils match

可以使用以下语法调用它。

BooleanUtils.and(new Boolean[]{Boolean.TRUE, Boolean.TRUE});

但是,根据该方法的javadoc,用法细节是不同的。

JavaDoc

literal boolean

Wrapper Boolean

Valid way to call BooleanUtils.and


答案 1

这是因为重载 varargs 方法不适用于基元类型及其对象包装类型。关于apache-commons-lang3没有什么可责怪的。

varags是如何工作的?

在编译期间,varags 方法签名将替换为 。在这里,方法将转换为ArrayBooleanUtils.and

public static boolean and(final boolean[] array) { ... 
}

public static boolean and(final boolean[] array) { ... 
}

您传递给他们的参数将被替换为 .在这种情况下,你会得到这个Array

BooleanUtils.and(new boolean[]{true, true}) 
BooleanUtils.and(new Boolean[]{Boolean.TRUE, Boolean.TRUE})

为什么使用模棱两可的方法调用?

您可以发现转换后的方法参数是一个类型,并且它与此类型匹配这两个方法。因此,编译器发现没有一个比另一个更合适。它无法确定哪个方法最具体地调用。Array

但是,当您自己声明或向编译器公开您的意图时,选择的方法没有装箱或自动装箱。BooleanUtils.and(new Boolean[]{Boolean.TRUE, Boolean.TRUE})BooleanUtils.and(new boolean[]{true, true})

这就是编译器如何识别3个阶段的适用方法。查看有关选择最具体方法的详细信息

第一阶段 (§15.12.2.2) 执行重载解析,不允许装箱或取消装箱转换,也不允许使用可变 arity 方法调用。如果在此阶段找不到适用的方法,则处理将继续到第二阶段。

第二阶段 (§15.12.2.3) 在允许装箱和取消装箱的同时执行重载解析,但仍排除使用可变 arity 方法调用。如果在此阶段找不到适用的方法,则处理将继续到第三阶段。

第三阶段 (§15.12.2.4) 允许将重载与可变 arity 方法、装箱和取消装箱相结合。


答案 2

这样的编译错误出现在JDK8中。我相信,commons-lang的javadoc是过去写的。(当JDK7是最新的SDK时)。似乎,这是JDK8发布的功能之一的副作用(可能是)。lambas


推荐