考虑以下病理示例:
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我们在同一个班级中都知道和喜欢的东西呢?我们不能导入它,也不能使用完全限定的名称,因为将使用嵌套的类符号。
java.util.ArrayList
在这种情况下我们该怎么办?(除了显而易见的以外-停止对嵌套类使用此类肆意的邪恶名称)。
java.util.ArrayList如果您完成了以下两项操作,则不能再直接引用:
ArrayList
util
java
您甚至无法“拆分”导入,以尝试使用“部分合格”的导入。
import java.*; ... // This doesn't work! new util.ArrayList<>();
您可以import java.*;,但是那毫无价值。没有java直接在包中定义任何类。
import java.*;
但是,您可以java.util.ArrayList间接引用该类,因为它不是final。在类范围之外Ideone,声明一个具有不同名称的子类。
final
Ideone
class AnArrayList<T> extends java.util.ArrayList<T> {}
然后,您可以将该类和程序引用到接口:
List<Integer> al = new AnArrayList<>(); // won't print !! or Here