ProgrammingJava開発者

Javaにおけるメソッドのオーバーロード(overloading)とは何か、どのように実現され、使用時の注意点は何か?

Hintsage AIアシスタントで面接を突破

答え

メソッドのオーバーロード(method overloading)とは、同じ名前のメソッドを異なるパラメータ(型、順序、数)で複数作成する機能です。このアプローチは、類似の操作を論理的にグループ化し、コードの可読性を向上させます。

public class MathUtil { public int sum(int a, int b) { return a + b; } public double sum(double a, double b) { return a + b; } public int sum(int a, int b, int c) { return a + b + c; } }

注意点:

  • Javaはメソッドをシグネチャ(名前 + パラメータリスト)によって区別します。戻り値の型はオーバーロードには影響しません。
  • プリミティブ型のメソッドオーバーロードでは、暗黙の型変換(widening)が可能であり、呼び出し時の曖昧さを引き起こすことがあります。
  • オーバーロードされたメソッドでのvarargsの使用は、予期しない結果を避けるために注意が必要です。

ひっかけ問題

質問: 戻り値の型だけでメソッドをオーバーロードできますか(パラメータを変更せずに)?

答え: いいえ。オーバーロードはパラメータリストの違いによってのみ可能です。戻り値の型だけの違いではコンパイルエラーが発生します。

void foo(int a) {} int foo(int a) { return 1; } // エラー!戻り値の型はオーバーロードには考慮されません。

このテーマに関する誤解から生じた実際のエラーの例


逸話

あるプロジェクトで、開発者は2つのメソッドを作成しました:

public void process(int x, double y) {...} public void process(double x, int y) {...}

process(5, 10)を呼び出すと、コンパイラは適切なバージョンを選択できず、呼び出しの曖昧さについてのエラーが発生しました。これがモジュールの納品を遅らせました。


逸話

アプリケーションでは、varargsと配列を基にしたオーバーロードされたメソッド:

public void log(String... messages) {...} public void log(String[] messages) {...}

配列String[] dataを渡すと、期待したオーバーロードが呼ばれないことがあり、一部の情報が失われる — 不適切にログが記録されました!配列とvarargsの違いが重大でした。


逸話

開発者は、自動ボクシングを考慮せずにクラスのメソッドをオーバーロードしました:

public void save(Integer i) {...} public void save(int i) {...}

save(null)を呼び出すと、プリミティブintで呼び出されたためにNullPointerExceptionが発生しました。Javaは最も特異な型(int)を選ぶため、nullをプリミティブに変換できません!