連載
» 2006年06月28日 10時00分 公開

JavaTips 〜Javaプログラミング編:メソッドのオーバーロードで「あいまいです」エラー

[平野正喜,@IT]

 オーバーロードしているメソッドが呼び出された場合、引数の指定によってマッチするものが選択されます。よって、下記のようなプログラムの場合、Stringクラスを型として持つ一つめのメソッドが用いられます。これは、参照型でないと値としてnullを取ることができないからです。

注:基本型であるint型は値としてnullを取ることはできません。

画面1 変更前と実行結果 画面1 変更前と実行結果

 しかし、ここにStringBufferクラスを型として持つメソッドを追加すると、メソッドの呼び出しが「あいまいです」エラーになってしまいます。これはどういうことでしょうか。

画面2 メソッドを追加するとエラーに 画面2 メソッドを追加するとエラーに

複数のメソッドがマッチするとエラーになる

 この「あいまいです」というエラーは、オーバーロードしているメソッドが呼び出された場合に、引数の指定によってマッチするものが複数選択できる場合に表示されます。この場合、StringクラスもStringBufferクラスも、値としてnullを取ることができるため、どちらも選択が可能なことからエラーが表示されたわけです。つまり、先にマッチしたものが優先されることはありません。

 このエラーは、下記のように呼び出しにおいて型を明示すると解消します。

画面3 キャストを追加すると解消 画面3 キャストを追加すると解消

エラーになるとは限らないので注意

 ただし、このエラーはある条件においては発生しなくなります。例えば、下記のようにExceptionクラスとNullPointerExceptionクラスの場合にはエラーにならず、NullPointerExceptionクラスを型として持つ二つめのメソッドが用いられます。

画面4 エラーにならない場合 画面4 エラーにならない場合

 これは、ExceptionクラスがNullPointerExceptionクラスのスーパークラスだからで、サブクラスであるNullPointerExceptionが自動的に優先されます。ですから、スーパークラスに当てはめたい場合は、キャストなどによる明示が必要です。

 なお、継承関係があっても、同じ地位のサブクラスが複数ある場合は、やはりエラーになります。

画面4 同じ地位のサブクラスが複数あるとエラー 画面4 同じ地位のサブクラスが複数あるとエラー

 この例では、NullPointerExceptionクラスもNoSuchFieldExceptionもExceptionクラスのサブクラスであるため、「あいまいです」エラーが表示されるわけです。

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。