更准确地说
- 并不是说我们不允许导入与导入它的类具有相同简单名称的类,
- 但是我们不允许将导入类命名为与任何已经导入的类相同。
尝试这样做将导致错误消息:[NameOfImportingClass] is already defined in this compilation unit
。
此限制的目的是防止名称歧义/冲突。
例如,没有进口以下都是合法的:
package a;
class B{}
package b;
class B{
a.B objectPackageaB; //legal - full-package-name so no ambiguity
b.B objectPackagebB; //legal - full-package-name so no ambiguity
B objectB; //legal, as now it can only represent B from package "b" -> b.B
}
现在让我们添加import a.B
package b;
import a.B; // <---
class B {
b.B objectbB; //still legal, full-package-name so no ambiguity
a.B objectaB; //still legal, full-package-name so no ambiguity
B objectB; //ambiguous, so ILLEGAL. Which type B should represent? a.B OR b.B?
}
如果 Java 不能阻止这种情况,它需要决定B objectB
应该代表什么类型。
我们有两个选择:
- 它将代表正在导入
b.B
的 so 类型。但这意味着使用from package 我们仍然需要将其写为,这意味着冗余/死代码只会让程序员感到困惑。B
a
a.B
import a.B;
- 它将代表导入
a.B
的 so 类型。但那会感觉不自然,因为里面,会代表其他类型!.class B{ }
B
以上解决方案都不好。
如果问题没有好的解决方案,最好的选择是防止出现。