自动导入包的顺序和歧义

And*_*ter 5 java import jls

JLS:第7章包:

包由许多编译单元组成(第7.3节).编译单元自动访问其包中声明的所有类型,自动导入预定义包java.lang中声明的所有公共类型.

让我们假设以下代码:

package com.example.p1;
public class MyClass { }
Run Code Online (Sandbox Code Playgroud)
package com.example;
public class MyClass { }
Run Code Online (Sandbox Code Playgroud)
package com.example;
public class String { }
Run Code Online (Sandbox Code Playgroud)
package com.example;

import com.example.p1.*;

public class MainNameClash {
   private String s;    // No Error, even though ambiguous with java.lang.String!
   private MyClass m;   // No error, even though ambiguous with com.example.p1.MyClass!
}
Run Code Online (Sandbox Code Playgroud)

如果我MyClass从中com.example移入com.example.p2并导入它import com.example.p2.*,我会到达Error: the type MyClass is ambigious使用它的地方.

似乎包中的类型总是优先于任何其他导入的类型,无论是自动显示java.lang还是显式地使用通配符导入,并且编译器不会发出任何警告或错误.

题:

  • 为什么java编译器在这种情况下不会发出歧义错误?
  • 在JLS中定义了这种行为?

Roh*_*ain 7

表格的进口声明:

import packageName.subPackage.*
Run Code Online (Sandbox Code Playgroud)

Type-Import-on-Demand声明.即,只有在当前编译单元范围内该类型不可用时,才会导入类或其中的任何类型.

仅从该JLS部分的示例7.5.2-1:

声明可能会被一个简单名称为Vector的类型的单一类型导入声明所掩盖; 通过名为Vector的类型并在编译单元所属的包中声明 ; 或任何嵌套的类或接口.

因此,如果您的类String与您的类在同一个包中,那么String在该类中使用将引用您的类,因为java.lang.String不会导入.它只会按需导入,如JLS§6.4.1示例6.4.1-2所示- 阴影.