- ベストアンサー
メソッドのオーバーロードとオーバーライドのシグニチャはどうして違うの?
オーバーロードのほうはメソッド名+引数の数+引数のデータ型ですが、オーバーライドのほうはそれに加えて戻り値の型も加わります。 どうして同じではいけないのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず、シグネチャという言葉の使い方が間違っています。Javaにおいて「メソッドのシグネチャ」とは「メソッドの名前と引数の数と引数の型」という意味です。したがって「オーバーライドのシグネチャ」とか「オーバーロードのシグネチャ」などという表現は意味を成しません。「オーバーライド時に共通させるもの」などと表現してください。 > 一応どのクラスが何をするのかということを把握して作成しているものには何も不都合が感じないと思いますが。ここでは大規模開発のことで他人の作成した…… その程度ではオブジェクトの「多態性」は実現できません。 サブクラスがスーパークラスと互換性のあるインターフェースを備えていることのは多態性の必要条件です。そうでなければサブクラスにスーパークラスの振りをさせる意味がありません。(スーパークラスとサブクラスという親子関係を作る意味がないといっても良い) 二つのクラスに親子関係を作り、両者に互換性(というか共通性)を持たせようとするのであれば、オーバーライド関係にあるメソッドの振る舞い(=何という名前で何型の引数を受け取り何型の値を返すのか)が同じになるのは当然ではありませんか? Javaは型の扱いが厳密であることも忘れないでください。JavaScriptのような、型を演算時にしかチェックしない放任主義の言語ではないのです。
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
オーバーライドは インタフェースはそのままで、振舞いを差し替えるものだからです。
Javaは型が静的なので、もし戻り値の型が変わったら大変だと思いませんか? たとえばクラスPで宣言していたメソッドと、それを継承したクラスCでオーバーライドしたメソッドの戻り値が違った場合、二つのクラスのオブジェクトを実行時に同等に扱うことができません。 実行時に同等に扱えないということは、プログラミングの時点でどのクラスのオブジェクトかチェックしてからメソッドを呼ぶことになり、そうすると「継承しても同じメソッドを同じように呼べる」というオーバーライドのメリット(というより継承のメリット)を殺すことになります。 という理由ではダメでしょうか。 オーバーロードは「同じ名前の別メソッド」だから、あらかじめどのメソッドを呼ぶかをプログラミングの時点で分かっているはずで、当然も戻り値が違うことも分かっています。だから戻り値が変わっても問題ないですね。 型を静的に決定しない言語の場合は戻り値の型というのも存在しないので、ご質問にある制約は全く考える必要がないでしょう。(Rubyとかそうかもしれません)
補足
>実行時に同等に扱えないということは、プログラミングの時点でどのクラスのオブジェクトかチェックしてからメソッドを呼ぶことになり、 とありますが、一応どのクラスが何をするのかということを把握して作成しているものには何も不都合が感じないと思いますが。というか、ここでは大規模開発のことで他人の作成したプログラムを一々中身を隅から隅まで見ないので、戻り値の型を気にせず、メソッド名だけで判断できるということのための利点でオーバライドでは戻り値の型をシグニチャに含むということなんでしょうか?
- torakiyojp
- ベストアンサー率58% (25/43)
質問の意味がよくわかりませんが、こちらを読んでみてください。 http://www2s.biglobe.ne.jp/~yuuki_ki/java_class8.htm
お礼
サブクラスとスーパークラスの互換性をもたせるためにオーバライドでは戻り値の型まで同じではないといけないということですか。とりあえず分かりました。ありがとうございます。