包由许多编译单元组成(第7.3节)。编译单元自动访问其包中声明的所有类型,并且自动导入预定义包java.lang 中声明的所有公共类型。
让我们假设以下代码:
package com.example.p1;
public class MyClass { }
package com.example;
public class MyClass { }
package com.example;
public class String { }
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!
}
如果我将MyClass
从com.example
移到com.example.p2
并将其导入import com.example.p2.*
,我会在Error: the type MyClass is ambigious
处使用java.lang
。
看起来包中的Types总是优先于任何其他导入的类型,无论是从{{1}}自动还是显式地使用通配符导入,并且编译器不会发出任何警告或错误
问题:
答案 0 :(得分:7)
表格的导入声明:
import packageName.subPackage.*
是Type-Import-on-Demand Declarations。即,只有在当前编译单元范围内没有该类型时,才会导入类或其中的任何类型。
仅来自该JLS部分的示例 7.5.2-1 :
声明可能被简单名称为Vector的类型的单一类型导入声明遮蔽; 由名为Vector的类型并在编译单元所属的包中声明;或任何嵌套的类或接口。
因此,如果您的课程与同一个课程中有String
课程,那么在该课程中使用String
会引用您的课程,因为java.lang.String
将不会被导入。它只会在需求上导入,如example 6.4.1-2的JLS § 6.4.1 - Shadowing所示。
答案 1 :(得分:2)
我认为Shadowing & Obscuring涵盖了这一点,因为包范围的Class优先于通配符导入。
答案 2 :(得分:0)