【发布时间】:2011-12-15 00:09:18
【问题描述】:
我喜欢在这里使用这种方法:
org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)
唯一的缺点(例如,与 Google Guava 相比)是我无法静态导入该方法。 IE。这是没用的:
import static org.apache.commons.lang.ObjectUtils.equals;
...因为我的 Eclipse 编译器在编写时不会正确链接该方法
equals(obj1, obj2);
错误是:
Object类型中的equals(Object)方法不适用于参数(..., ...)
这是为什么呢?如果任何超类型中有同名(但签名不同)的方法,我的静态导入方法是否不适用?这是在 JLS 中正式规定的吗? 还是一些 Eclipse 编译器问题?
更新
这也不起作用:
import static org.apache.commons.lang.ObjectUtils.defaultIfNull;
public class Test {
void test() {
defaultIfNull(null, null);
// ^^ compilation error here
}
void defaultIfNull() {
}
}
javac 错误信息:
Test.java:5: defaultIfNull() in Test cannot be applied to (<nulltype>,<nulltype>)
defaultIfNull(null, null);
^
1 error
【问题讨论】:
-
您是否考虑过创建自己的“实用程序”类来委托给该方法?然后,您可以将其命名为您想要的任何名称,然后它们会静态导入。
-
我看过了,在 JLS 中找不到很好的描述。听到它在某个地方我不会感到惊讶,当然......
-
@tjg184:我不介意写
ObjectUtils.equals(a, b)。这更像是一个学术问题。我想了解编译器... -
@JonSkeet:我也没有找到任何东西,但那是我对规范缺乏理解:-)。但是在过去,我已经看到了 Eclipse 编译器的那种错误,所以它可能会朝着那个方向发展......
-
@Dhirendra 的修订答案看起来是正确的。另请注意,Guava 工程师将签名更改为 Objects.equal(o1, o2)。然而,JDK7 对象使用等号签名。
标签: java static import compiler-errors equals