gpt4 book ai didi

java - 如何使用 apache commons BooleanUtils.and 方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:11 39 4
gpt4 key购买 nike

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

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

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

调用BooleanUtils.and方法时,会抛出ambiguous method call错误。

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

最佳答案

这是因为重载可变参数方法对原始类型及其对象包装器类型不起作用。 apache-commons-lang3 无可厚非。

可变参数如何工作?

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

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

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

您传递给它们的参数将被替换为一个数组。在这种情况下你会得到这个

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

为什么调用Ambigious Method?

您会发现转换后的方法参数是一个Array 类型,并且它与该类型的两种方法都匹配。所以编译器发现没有一个比另一个更合适。它无法决定调用哪个方法最具体。

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

这就是编译器在 3 个阶段中识别适用方法的方式。查看有关 Choosing the Most Specific Method 的详细信息

The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.

The second phase (§15.12.2.3) performs overload resolution while allowing boxing and unboxing, but still precludes the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the third phase.

The third phase (§15.12.2.4) allows overloading to be combined with variable arity methods, boxing, and unboxing.

关于java - 如何使用 apache commons BooleanUtils.and 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49252638/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com