【问题标题】:Why don't I have to import some classes? [duplicate]为什么我不必导入一些类? [复制]
【发布时间】:2014-07-05 09:09:41
【问题描述】:

看看这个.java文件:

class A {
    HashMap a;
}

它不能编译;我需要import java.util.HashMap;。现在考虑这个:

class A {
    String a;
}

它完全一样——除了String 而不是HashMap——所以它不应该编译,对吧?错了。

好的,众所周知,您不必导入String,但为什么呢? “显而易见”的答案是因为 String 的使用频率远高于 HashMap,但 ArrayList 不应该是“隐式导入”的吗?那么原始包装类呢,例如IntegerBoolean? ArrayListLongFloat 更频繁地使用,但我必须导入ArrayList 而不需要导入Float

不需要导入StringIntegerCharacterException 和其他几个类的原因是什么?

【问题讨论】:

  • 阅读关于在每个 java 文件中自动导入的 java.lang 包。
  • 为什么这被否决了? The question it is a duplicate of 有 +33/-0,而且没有那么详细...
  • @TheGuywithTheHat 自提出该问题以来已经过去了一年多。 Java 标签中的社区用户比那个时代更具攻击性。此外,如果您阅读了答案,MarkBiers 会通过显式发布 JLS 的相关部分来详细解释为什么会这样,其中声明这些类是自动导入的,IMO 应该是答案。只是补充一下,我不是一个反对者,我不知道存在这样的问题。
  • 技术原因已在重复问题中得到解答,因此我们无需再次提问。 “为什么”问题是题外话,因为这不是一个具体的编程问题。 Java 设计者本可以决定将 java.util 中的所有内容添加到 java.lang 中,但他们决定反对。

标签: java import


【解决方案1】:

显而易见的答案是因为String 的使用频率远高于HashMap

没有。 String 属于java.lang 包,由编译器自动导入。

来自java.langjavadoc:

提供 Java 编程语言设计的基础类。最重要的类是 Object,它是类层次结构的根,以及 Class,它们的实例代表运行时的类。

来自Java Language Specification. Chapter 7. Packages

一个包由许多编译单元 (§7.3) 组成。编译单元自动访问其包中声明的所有类型,并自动导入预定义包java.lang 中声明的所有public 类型。

【讨论】:

    【解决方案2】:

    您不必导入的类是java.lang 包中的那些类。

    JLS, Chapter 7,声明:

    编译单元自动访问其包中声明的所有类型,并自动导入预定义包 java.lang 中声明的所有公共类型。

    StringIntegerCharacterExceptionBoolean 都在 java.lang 包中。但是,ArrayListHashMap 位于 java.util 包中,如您所知,如果使用它们需要导入(或者它们可能是完全限定的)。

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2018-12-17
      • 2017-01-01
      • 2023-04-09
      • 2013-07-07
      • 1970-01-01
      • 2011-09-03
      • 2011-11-14
      • 2021-09-26
      相关资源
      最近更新 更多