オーバーロードしているメソッドが呼び出された場合、引数の指定によってマッチするものが選択されます。よって、下記のようなプログラムの場合、Stringクラスを型として持つ一つめのメソッドが用いられます。これは、参照型でないと値としてnullを取ることができないからです。
注:基本型であるint型は値としてnullを取ることはできません。
しかし、ここにStringBufferクラスを型として持つメソッドを追加すると、メソッドの呼び出しが「あいまいです」エラーになってしまいます。これはどういうことでしょうか。
この「あいまいです」というエラーは、オーバーロードしているメソッドが呼び出された場合に、引数の指定によってマッチするものが複数選択できる場合に表示されます。この場合、StringクラスもStringBufferクラスも、値としてnullを取ることができるため、どちらも選択が可能なことからエラーが表示されたわけです。つまり、先にマッチしたものが優先されることはありません。
このエラーは、下記のように呼び出しにおいて型を明示すると解消します。
ただし、このエラーはある条件においては発生しなくなります。例えば、下記のようにExceptionクラスとNullPointerExceptionクラスの場合にはエラーにならず、NullPointerExceptionクラスを型として持つ二つめのメソッドが用いられます。
これは、ExceptionクラスがNullPointerExceptionクラスのスーパークラスだからで、サブクラスであるNullPointerExceptionが自動的に優先されます。ですから、スーパークラスに当てはめたい場合は、キャストなどによる明示が必要です。
なお、継承関係があっても、同じ地位のサブクラスが複数ある場合は、やはりエラーになります。
この例では、NullPointerExceptionクラスもNoSuchFieldExceptionもExceptionクラスのサブクラスであるため、「あいまいです」エラーが表示されるわけです。
Copyright © ITmedia, Inc. All Rights Reserved.