私はJava開発の初心者です。Java での再帰インポートについて簡単な質問があります。
パッケージ「pkg」に次のものが含まれていると仮定しましょう
- クラスA、
- パッケージ B (これには B1 クラスが含まれます)
- パッケージ C (これには C1 クラスが含まれます)
パッケージ「B」および「C」からクラスをインポートできないのはimport pkg.*
なぜですか?
Java が再帰インポートを許可しない理由を理解したいと思います。
私はJava開発の初心者です。Java での再帰インポートについて簡単な質問があります。
パッケージ「pkg」に次のものが含まれていると仮定しましょう
パッケージ「B」および「C」からクラスをインポートできないのはimport pkg.*
なぜですか?
Java が再帰インポートを許可しない理由を理解したいと思います。
あなたの質問は、あなたがパッケージからimport pkg.*
クラスをインポートすることを確かに許可されているので、あなたの質問は不十分に表現されています. つまり、これを行うことはまったく問題ありません。pkg.B
pkg.C
import pkg.*;
import pkg.B.*;
import pkg.C.*;
しかし、あなたが本当に求めているimport pkg.*
のは、のサブパッケージで宣言された型を自動的にインポートしない場合、その理由だと思いますpkg
。それに答えるには、Java 言語仕様に目を向けるのが最善です。
パッケージの階層的な命名構造は、従来の方法で関連するパッケージを整理するのに便利であることを目的としていますが、最上位の型と同じ単純な名前を持つサブパッケージを持つパッケージを禁止すること以外には意味がありません (§7.6)。そのパッケージで宣言されています。
たとえば、 という名前のパッケージと という名前
oliver
の別のパッケージoliver.twist
の間、または とevelyn.wood
という名前のパッケージの間に特別なアクセス関係はありませんevelyn.waugh
。つまり、 という名前のパッケージ内のコードは、他のパッケージ内のコードよりも、oliver.twist
パッケージ内で宣言された型に適切にアクセスできません。oliver
つまり、 の場合、という名前のパッケージに含まれるコンパイル ユニットによって定義されたimport pkg.*
すべてのトップレベルの型pkg
をインポートしていますが、 (またはなどの)のサブパッケージはインポートしていません。pkg
pkg.B
pkg.C
なぜimport java.awt.*
インポートしないのかなどを尋ねているようですjava.awt.color.*
。
これは、このチュートリアルで説明されている場所で最もよく説明されています
最初、パッケージは階層的に見えますが、そうではありません。たとえば、Java API には、java.awt パッケージ、java.awt.color パッケージ、java.awt.font パッケージ、および java.awt で始まる他の多くのパッケージが含まれています。ただし、java.awt.color パッケージ、java.awt.font パッケージ、およびその他の java.awt.xxxx パッケージは、java.awt パッケージに含まれません。接頭辞 java.awt (Java Abstract Window Toolkit) は、関係を明確にするために多数の関連パッケージに使用されますが、含まれていることを示すためではありません。
さらに重要なことには、
java.awt.* をインポートすると、java.awt パッケージ内のすべてのタイプがインポートされますが、java.awt.color、java.awt.font、またはその他の java.awt.xxxx パッケージはインポートされません。java.awt.color と java.awt のクラスおよびその他のタイプを使用する場合は、両方のパッケージとそのすべてのファイルをインポートする必要があります。
import java.awt.*; import java.awt.color.*;
Java での規則は、必要なクラスのみをインポートすることです。ほとんどの IDE では、自動的に整理されます。クラスを一括でインポートすることは、他の言語のように一般的ではありません。
元の質問 (編集前) で説明したように、インポートに制限はありません。
次の階層があるとします。
pkg1
A.java
pkg1.pkg2
B.java
pkg1.pkg3
C.java
D.java
A.java、B.java、C.java、D.java、またはそれらの組み合わせのいずれかをインポートすることが許可されています。
import pkg1.A;
import pkg1.pkg2.B;
import pkg1.pkg3.C;
import pkg1.pkg3.D;
唯一の注意点は、クラス C 内では、同じパッケージを共有しているため、D を明示的にインポートせずにクラス D を使用できることです。
ただし、次のような包括的なステートメントimport pkg1.*
は、パッケージ階層のさらに下にあるクラスを取得しません。などの各サブパッケージもインポートする必要がありますimport pkg1.pkg2.*
。これは、言語の設計方法です。