当前位置: 首页 > 面试题库 >

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

仉运乾
2023-03-14
问题内容

考虑以下病理示例:

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如果您完成了以下两项操作,则不能再直接引用:

  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


 类似资料:
  • 我的Gradle项目中有两个依赖项库: OLD:完全使用lib 新:只有db库(固定库) 它们都拥有相同的数据库连接类,包括包,例如:net。我的公司。常见的dbsq。DBConnector()。 我需要的是确保使用新的db连接类,但由于所需的UTIL的其余部分在新的数据库中不可用,所以保留旧的(可以没有db类)作为依赖项。 是否有可能仅排除/包括依赖项的特定类或包?或者确保相同命名类的“重写”?

  • 问题内容: 考虑以下jfiddle http://jsfiddle.net/bchapman26/9uUBU/29/ 我有2个模块(module1和module2)。module1和module2都定义了一个名为myService的服务。当两个模块都导入myApp时,这似乎在Angular中的myService上创建了名称冲突。看来AngularJs仅使用第二个服务定义,而没有警告您可能的问题。

  • 问题内容: 我正在使用两个具有相同名称的python软件包。 http://www.alembic.io/updates.html https://pypi.python.org/pypi/alembic 是否有规范或Python方式处理名称冲突的两个软件包的安装?到目前为止,我在开发/构建过程中仅偶尔需要一个软件包,因此我一直在使用单独的virtualenv来处理冲突,但是这使构建步骤变得更加复

  • 反射类和方法以及类加载器等都需要使用所谓的“二进制”类名。 类的完全限定名为。然而,要获得类对象,需要编写: 而不是 因为恰好是的内部类。

  • 案例1。类扩展了java。util。阵列列表{ { } } 这里我得到一个compiletime错误,表示找不到符号 案例2。类扩展了java。util。阵列列表 { } 这个正在成功编译。 那么扩展ArrayList类有什么必要呢?如果我们不能利用它(如案例1)

  • 问题内容: 在Java中,这些之间有什么区别: 我已经多次检查过Javadoc,但这从来不能很好地解释它。我也进行了测试,但没有反映出调用这些方法背后的任何实际含义。 问题答案: 如果不确定某件事,请尝试先编写测试。 我这样做: 印刷品: 最后一个块中有一个空条目,其中返回一个空字符串。 结果是: 该 名称 是您愿意使用动态加载与类,例如,调用的名称与默认。在一定范围内,所有类都有唯一的名称。 该