メソッドのオーバーロード(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; } }
質問: 戻り値の型だけでメソッドをオーバーロードできますか(パラメータを変更せずに)?
答え: いいえ。オーバーロードはパラメータリストの違いによってのみ可能です。戻り値の型だけの違いではコンパイルエラーが発生します。
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をプリミティブに変換できません!