变量和顶级包名之间的Java名称冲突
在这个bug报告的触发下,我将问题简化为Java中的这个最小示例,它简单地显示了效果的核心变量和顶级包名之间的Java名称冲突,java,namespaces,name-collision,Java,Namespaces,Name Collision,在这个bug报告的触发下,我将问题简化为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
package nl.basjes.experiment;
public class NamingClash {
String nl = "foo";
public void test() {
nl.basjes.experiment.NamingClash.foo();
}
private static void foo() {
// Do something
}
}
试着编译它会给你
error: cannot find symbol
nl.basjes.experiment.NamingClash.foo();
^
symbol: variable basjes
location: variable nl of type String
在AVRO中,代码是生成的,在假设人们有时会选择意外的名称的情况下,它必须尝试避免名称冲突
在这个例子中假设
注意,对于触发这个问题的AVRO bug,我找到了一个解决方法。我在这里寻找“一般答案”。我可以看到两种解决方案: 1) 使用仅由当前类名限定的方法名(而不是完全限定名)调用该方法:
public void option1() {
NamingClash.foo();
}
2) 通过当前类对象的this
指针调用static方法,并抑制“static access”警告
@SuppressWarnings("static-access")
public void option2() {
this.foo();
}