戻り値の型を変更するだけで関数をオーバーロードできないのはなぜですか?それは、Javaの将来のバージョンで変更されますか?
ちなみに、参考までに、これはC ++で可能ですか?
戻り値の型を変更するだけで関数をオーバーロードできないのはなぜですか?それは、Javaの将来のバージョンで変更されますか?
ちなみに、参考までに、これはC ++で可能ですか?
回答:
Javaではできませんし、C ++ではできません。その理由は、コンパイラーがどの関数を呼び出すかを理解するには、戻り値だけでは十分ではないということです。
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
ではありませんdouble
。
foo();
戻り値の型がないとあいまいになるという事実は、必ずしもそれをオーバーロードとして許可しない理由ではありません。あいまいさを引き起こす可能性のある引数があります(例:)foo(null);
が、それによってオーバーロードが本質的に無効になるわけではありません。
その理由は、Javaのオーバーロードは、異なるシグネチャを持つメソッドに対してのみ許可されるためです。
戻り値の型はメソッドシグネチャの一部ではないため、オーバーロードを区別するために使用できません。
Javaチュートリアルからのメソッドの定義を参照してください。
calculateAnswer(double, int, double, double)
」。戻り値の型が含まれていないことを確認してください、@ konmik。
Java 5.0より前では、メソッドをオーバーライドする場合、パラメーターと戻り値の型の両方が正確に一致する必要があります。Java 5.0では、共変戻り型と呼ばれる新しい機能が導入されています。同じシグネチャでメソッドをオーバーライドできますが、返されたオブジェクトのサブクラスを返します。言い換えると、サブクラスのメソッドは、スーパークラスで同じシグネチャを持つメソッドによって返されたタイプのサブクラスであるタイプのオブジェクトを返すことができます。
Overloaded
引数も異なる場合、Javaのメソッドは異なる戻り値の型を持つ場合があります。
サンプルコードを確認してください。
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
コンパイラーはメソッドを区別するときに戻り値の型を考慮しないため、戻り値の型が異なっていても、同じシグニチャーを持つ2つのメソッドを宣言することはできません。
関数の実行を認識している場合は、関数を呼び出すときに定義部分が実行され、最後にreturnステートメントが必要であることを認識します。そのため、returnは関数全体の定義の後に来ると言えます。同じ名前、同じタイプ、noの関数が他にもあります。関数名とパラメーターが同じであるため、呼び出し時のコンパイラーはどの引数が呼び出されるかをどのように認識するかを呼び出し時に。最初に呼び出すとき、すべての焦点は引数と関数名になり、関数定義の完了後、ようやくreturnステートメントを扱います。
コンパイル時エラーは実行時エラーよりも優れています。したがって、同じパラメーターを持つ同じメソッドを宣言すると、Javaコンパイラーはコンパイラー時間エラーをレンダリングします。
あなたが引数なしで、または引数のデータ型でのみオーバーロードできるように、実際には不可能ではありません