ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

Javaで1つのクラスに同名のクラスをインポートする場合

今更ですが、メモ程度にタイトルの通りJavaで1つのクラスに同名のクラスをインポートする場合にどうするかを紹介したいと思います。

同名のクラスをインポートするとどうなるか。

同名のクラスとしてよく紹介される、「java.util.Date」と「java.sql.Date」で試してみます。

以下のように、「java.util.*」、「java.sql.*」という形でimportして、Dateクラスを使うと「型 Date はあいまいです」というエラーメッセージが表示されます。

同名のクラスをインポートするとエラー

それは、そのはずで「java.util.Date」と「java.sql.Date」どちらのDateクラスかをコンパイラが判別できないからですよね。

java.util.Date」を明示的にimportして、「java.sql.*」という形でimportするとどうなるか。

java.util.Date」を明示的にimportして、「java.sql.*」という形でimportすると特にエラーは発生しなくなりました。

java.util.Date」のみを明示的にimport

明示的に「java.util.Date」というimportをすると、ソース上のDateクラスは明示的に指定したクラスを指すことになるようです。
また、「java.sql.*」は一度も使われていないという判定になり、警告メッセージが付与されています。

java.sql.*」は一度も使われていない警告メッセージ

java.util.Date」、「java.sql.Date」どちらもソースで使いたい場合はどうするか。

java.util.Date」、「java.sql.Date」のどちらも明示的にimportすると以下のようにエラーになります。

java.util.Date」、「java.sql.Date」どちらも明示的にimport

エラーメッセージは、「インポート java.sql.Date は、別の import 文と一致しません」という文言です。これはおそらく、「インポート java.sql.Date は、別の import 文と一致します」だと思うのですが、とにかく同じクラス名の複数のimport文は記載できない模様です。

なので、どちらかはimportを諦めてクラスを使う場所でパッケージも指定する形(完全修飾クラス名)で定義すれば良さそうです。

java.sql.Dateを完全修飾クラス名で定義

ここでは、「java.util.Date」はimportをしてるので使う側では単純にDateと定義し、「java.sql.Date」は完全修飾クラス名で定義しています。