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

2022-09-03 15:36:13

考虑以下病理示例:

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呢?我们无法导入它,也不能使用完全限定的名称,因为将使用嵌套的类符号。

在这种情况下,我们能做些什么?(除了显而易见的 - 停止对嵌套类使用这种肆无忌惮的邪恶名称)。


答案 1

如果您已经完成了已完成的2件事,则无法再直接引用:java.util.ArrayList

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

您甚至不能“拆分”导入以尝试使用“部分限定”的导入。

import java.*;

...

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

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

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

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

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

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

答案 2

我要四肢着地说,不可能从内部引用它。我看到的唯一解决方案是创建另一个类(它是的嵌套(即它驻留在同一个文件中)),并从那里返回一个用于:IdeoneIdetwoIdeonejava.util.ArrayListIdeone

import java.util.ArrayList;

class Ideone {
    ...
}

class Idetwo {
    static ArrayList<Integer> getList() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        return list;
    }
}

你只需将 你的主要方法更改为类似的东西:Ideone

public static void main(String[] args) throws Exception {
    new Ideone.ArrayList<>();
    new Ideone.java.util.ArrayList<>();
    Idetwo.getList().forEach(System.out::println);
}

输出:

!!
Here
1
2
3

注意:使用此方法,导入将正常工作。但是,如果要在 里面调用 main 方法,则需要导入 ,因为单个导入将不起作用(有趣的是)。java.util.ArrayListList<Integer> list = Idetwo.getList();Ideonejava.util.*


推荐