より正確には
- クラスをインポートするクラスと同じ単純な名前のクラスをインポートすることが許可されていないわけではありません。
- ただし、既にインポートされているクラスと同じ名前をインポート クラスに付けることはできません。
そうしようとすると、次のエラー メッセージが表示されます[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
を表すかを決定する必要があります。
2 つのオプションがあります。
- インポートし
b.B
ているタイプを表します。しかし、それはパッケージから使用することを意味し、プログラマーを混乱させるだけの冗長/デッドコードであることを意味します。B
a
a.B
import a.B;
- インポートさ
a.B
れるタイプを表します。しかし、それは不自然に感じるでしょう。内部では、他のタイプを表しているからです! .class B{ }
B
上記の解決策はどちらも良くありません。
問題に対する適切な解決策がない場合、最善の選択肢は表示されないようにすることです。