No.4ベストアンサー
- 回答日時:
まず、シグネチャという言葉の使い方が間違っています。
Javaにおいて「メソッドのシグネチャ」とは「メソッドの名前と引数の数と引数の型」という意味です。したがって「オーバーライドのシグネチャ」とか「オーバーロードのシグネチャ」などという表現は意味を成しません。「オーバーライド時に共通させるもの」などと表現してください。> 一応どのクラスが何をするのかということを把握して作成しているものには何も不都合が感じないと思いますが。ここでは大規模開発のことで他人の作成した……
その程度ではオブジェクトの「多態性」は実現できません。
サブクラスがスーパークラスと互換性のあるインターフェースを備えていることのは多態性の必要条件です。そうでなければサブクラスにスーパークラスの振りをさせる意味がありません。(スーパークラスとサブクラスという親子関係を作る意味がないといっても良い)
二つのクラスに親子関係を作り、両者に互換性(というか共通性)を持たせようとするのであれば、オーバーライド関係にあるメソッドの振る舞い(=何という名前で何型の引数を受け取り何型の値を返すのか)が同じになるのは当然ではありませんか?
Javaは型の扱いが厳密であることも忘れないでください。JavaScriptのような、型を演算時にしかチェックしない放任主義の言語ではないのです。
参考URL:http://msugai.fc2web.com/java/polymorphism.html
サブクラスとスーパークラスの互換性をもたせるためにオーバライドでは戻り値の型まで同じではないといけないということですか。とりあえず分かりました。ありがとうございます。
No.2
- 回答日時:
Javaは型が静的なので、もし戻り値の型が変わったら大変だと思いませんか?
たとえばクラスPで宣言していたメソッドと、それを継承したクラスCでオーバーライドしたメソッドの戻り値が違った場合、二つのクラスのオブジェクトを実行時に同等に扱うことができません。
実行時に同等に扱えないということは、プログラミングの時点でどのクラスのオブジェクトかチェックしてからメソッドを呼ぶことになり、そうすると「継承しても同じメソッドを同じように呼べる」というオーバーライドのメリット(というより継承のメリット)を殺すことになります。
という理由ではダメでしょうか。
オーバーロードは「同じ名前の別メソッド」だから、あらかじめどのメソッドを呼ぶかをプログラミングの時点で分かっているはずで、当然も戻り値が違うことも分かっています。だから戻り値が変わっても問題ないですね。
型を静的に決定しない言語の場合は戻り値の型というのも存在しないので、ご質問にある制約は全く考える必要がないでしょう。(Rubyとかそうかもしれません)
この回答への補足
>実行時に同等に扱えないということは、プログラミングの時点でどのクラスのオブジェクトかチェックしてからメソッドを呼ぶことになり、
とありますが、一応どのクラスが何をするのかということを把握して作成しているものには何も不都合が感じないと思いますが。というか、ここでは大規模開発のことで他人の作成したプログラムを一々中身を隅から隅まで見ないので、戻り値の型を気にせず、メソッド名だけで判断できるということのための利点でオーバライドでは戻り値の型をシグニチャに含むということなんでしょうか?
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- C言語・C++・C# 3つの倍精度浮動小数点値の平均を求めて、3つの引数全てを平均値に変更するメソッドを作成し、キーボード 1 2022/07/13 16:04
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
public static void main (Stri...
-
レコード件数の表示
-
StringBufferからStringへキャ...
-
VBAで新規ファイル名
-
abstract と static を一緒に付...
-
C# でメソッドに送られてきたOb...
-
不要なstaticメソッドの見分け...
-
Java初心者です、エラーの意味...
-
Google Apps Script で getRang...
-
String.containsの反対機能はあ...
-
親の親のメソッドを呼ぶには?
-
リストボックスの並べ替え (VB...
-
djUnit コンストラクタがpriva...
-
なぜprotected overrideなのか
-
戻り値の異なるメソッドの多重...
-
return new使用時
-
JComponentを継承して処理をJBu...
-
【C#】WebBrowser上で表示され...
-
Javaの初期化メソッドについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
public static void main (Stri...
-
レコード件数の表示
-
abstract と static を一緒に付...
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
コマンドライン引数のチェック
-
String.containsの反対機能はあ...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
Java初心者です、エラーの意味...
-
javaに"search"という関数 or ...
-
C# でメソッドに送られてきたOb...
-
YYYYMMDD書式の日付に対する適...
-
メソッド宣言の戻り値の型にク...
-
return new使用時
-
readLine()ではじめから読み直...
-
シェルスクリプトからのJavaメ...
-
Fileの読み取り専用の解除
-
親の親のメソッドを呼ぶには?
おすすめ情報