我喜欢在这里使用这个方法:
org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)
Run Code Online (Sandbox Code Playgroud)
唯一的缺点(例如,与Google Guava相比),我无法静态导入该方法.即这没用:
import static org.apache.commons.lang.ObjectUtils.equals;
Run Code Online (Sandbox Code Playgroud)
...因为我的Eclipse编译器在编写时无法正确链接该方法
equals(obj1, obj2);
Run Code Online (Sandbox Code Playgroud)
错误是:
Object类型中的方法equals(Object)不适用于参数(...,...)
这是为什么?如果在任何超类型中存在具有相同名称(但不是相同的签名)的方法,我的静态导入方法是否不适用?这是在JLS中正式指定的吗?还是一些Eclipse编译问题?
UPDATE
这也不起作用:
import static org.apache.commons.lang.ObjectUtils.defaultIfNull;
public class Test {
void test() {
defaultIfNull(null, null);
// ^^ compilation error here
}
void defaultIfNull() {
}
}
Run Code Online (Sandbox Code Playgroud)
javac错误消息:
Test.java:5: defaultIfNull() in Test cannot be applied to (<nulltype>,<nulltype>)
defaultIfNull(null, null);
^
1 error
Run Code Online (Sandbox Code Playgroud) 由此错误报告AVRO-1814触发我将问题简化为Java中的这个最小示例,简单地显示了效果的核心.
package nl.basjes.experiment;
public class NamingClash {
String nl = "foo";
public void test() {
nl.basjes.experiment.NamingClash.foo();
}
private static void foo() {
// Do something
}
}
Run Code Online (Sandbox Code Playgroud)
试图编译这将给你
error: cannot find symbol
nl.basjes.experiment.NamingClash.foo();
^
symbol: variable basjes
location: variable nl of type String
Run Code Online (Sandbox Code Playgroud)
在AVRO中,生成代码并且必须尝试避免名称冲突,假设人们有时会选择意外的名称.
所以假设在这个例子中
除了告诉人们"就是不要那样做".
有避免这些冲突的解决方案吗?
请注意,对于触发此问题的AVRO错误,我找到了一种解决方法.在这里,我正在寻找'通用答案'.