小编典典

当简单名称和完全限定名称发生冲突时如何引用类

java

考虑以下病理示例:

class Ideone {
  static class ArrayList<T> {
    ArrayList() {
      System.out.println("!!");
    }
  }

  static class java {
    static class util {
      static class ArrayList<T> {
        ArrayList() {
          System.out.println("Here");
        }
      }
    }
  }

  public static void main(String[] args) {
    new ArrayList<>();
    new java.util.ArrayList<>();
    // Can I refer to the "usual" java.util.ArrayList?
  }
}

在构造函数中创建的两个实例属于嵌套类。

但是,我怎么能指称java.util.ArrayList我们在同一个班级中都知道和喜欢的东西呢?我们不能导入它,也不能使用完全限定的名称,因为将使用嵌套的类符号。

在这种情况下我们该怎么办?(除了显而易见的以外-停止对嵌套类使用此类肆意的邪恶名称)。


阅读 190

收藏
2020-11-16

共1个答案

小编典典

java.util.ArrayList如果您完成了以下两项操作,则不能再直接引用:

  1. ArrayList在作用域中使用静态嵌套类隐藏简单名称。
  2. java.util.ArrayList使用ArrayList嵌套在class中util,嵌套在嵌套class中的类来隐藏完全限定名称java

您甚至无法“拆分”导入,以尝试使用“部分合格”的导入。

import java.*;

...

// This doesn't work!
new util.ArrayList<>();

您可以import java.*;,但是那毫无价值。没有java直接在包中定义任何类。

但是,您可以java.util.ArrayList间接引用该类,因为它不是final。在类范围之外Ideone,声明一个具有不同名称的子类。

class AnArrayList<T> extends java.util.ArrayList<T> {}

然后,您可以将该类和程序引用到接口:

List<Integer> al = new AnArrayList<>();  // won't print !! or Here
2020-11-16