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,使用细节是不同的。
答案 0 :(得分:3)
这是因为重载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})
时,你会在没有拳击或自动装箱的情况下选择暴露你对编译器和方法的意图。
这就是编译器如何确定适用的方法n 3阶段。查看有关Choosing the Most Specific Method
的详细信息第一阶段(§15.12.2.2)执行重载分辨率而没有 允许装箱或拆箱转换,或使用变量arity 方法调用。如果在此阶段没有找到适用的方法 然后处理继续到第二阶段。
第二阶段(§15.12.2.3)执行重载分辨率 允许装箱和拆箱,但仍然排除使用变量 arity方法调用。如果在此期间未找到适用的方法 阶段然后处理继续到第三阶段。
第三阶段(§15.12.2.4)允许重载与 变量arity方法,装箱和拆箱。
答案 1 :(得分:0)
这种编译错误出现在JDK8中。我相信,公共场合的javadoc是在过去写的。 (当JDK7是最新的SDK时)。似乎,这是JDK8发布的功能之一的副作用(可能是lambas
)。