[英]Why does org.apache.commons.lang.BooleanUtils.isTrue(Boolean bool) use the ternary operator?
[英]How to use apache commons BooleanUtils.and method?
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,用法细节有所不同。
这是因为重载varargs方法不适用于原始类型及其对象包装器类型 。 apache-commons-lang3没什么可怪的。
在编译期间,将varags方法签名替换为Array
。 在这里, BooleanUtils.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})
,无需编译即可选择暴露给编译器和方法的意图或自动装箱。
这就是编译器在三个阶段中确定适用方法的方式。 查看有关选择最具体方法的详细信息
第一阶段(第15.12.2.2节)执行重载解析, 而不允许装箱或拆箱转换 ,也不允许使用可变arity方法调用。 如果在此阶段未找到适用的方法,则处理将继续进行到第二阶段。
第二阶段(第15.12.2.3节) 在允许装箱和拆箱的同时执行重载解析,但仍排除使用可变arity方法调用。 如果在此阶段未找到适用的方法,则处理将继续进行到第三阶段。
第三阶段(第15.12.2.4节)允许将重载与可变arity方法,装箱和拆箱相结合。
这种编译错误出现在JDK8中。 我相信,commons-lang的javadoc是以前编写的。 (当JDK7是最新的SDK时)。 似乎,这是JDK8(可能是lambas
)发布的功能之一的lambas
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.