Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
变量和顶级包名之间的Java名称冲突_Java_Namespaces_Name Collision - Fatal编程技术网

变量和顶级包名之间的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

在这个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
  }
}
试着编译它会给你

error: cannot find symbol
    nl.basjes.experiment.NamingClash.foo();
      ^
  symbol:   variable basjes
  location: variable nl of type String
在AVRO中,代码是生成的,在假设人们有时会选择意外的名称的情况下,它必须尝试避免名称冲突

在这个例子中假设

  • 需要“test()”方法中的完全限定类名以避免冲突
  • 变量“nl”只是架构定义中使用的名称
  • 生成一个像_nl___)这样的字段,并具有getter和setter,这将是一个破坏向后兼容性的更改,因为nl字段一直是公共的
  • 除了告诉人们“不要那样做”

    有没有办法避免这些冲突



    注意,对于触发这个问题的AVRO bug,我找到了一个解决方法。我在这里寻找“一般答案”。

    我可以看到两种解决方案:

    1) 使用仅由当前类名限定的方法名(而不是完全限定名)调用该方法:

    public void option1() {
        NamingClash.foo();
    }
    
    2) 通过当前类对象的
    this
    指针调用static方法,并抑制“static access”警告

    @SuppressWarnings("static-access")
    public void option2() {
        this.foo();
    }