戻り値の型を変更するだけでは関数をオーバーロードできないのはなぜですか? Javaの将来のバージョンでそれは変わりますか?
ちなみに、参考までに、これはC++で可能ですか?
Javaではできませんし、C++ではできません。その理由は、コンパイラがどの関数を呼び出すかを判断するには戻り値だけでは不十分だということです。
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
その理由は、Java)のオーバーロードは、異なるシグネチャを持つメソッドでのみ許可されるためです。
戻り値の型はメソッドシグネチャの一部ではないため、オーバーロードを区別するために使用することはできません。
Javaチュートリアルの メソッドの定義 を参照してください。
Java 5.0の前に、メソッドをオーバーライドする場合、パラメーターと戻り値の両方が完全に一致する必要があります。Java 5.0では、共変の戻り値型と呼ばれる新しい機能が導入されます同じシグネチャを持つメソッドをオーバーライドできますが、返されたオブジェクトのサブクラスを返します言い換えると、サブクラスのメソッドは、同じシグネチャを持つメソッドによって返された型のサブクラスである型のオブジェクトを返すことができますスーパークラス。
JavaのOverloaded
メソッドは、引数も異なる場合、異なる戻り値の型を持つことができます。
サンプルコードをご覧ください。
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つのメソッドを宣言することはできません。
メソッドをオーバーロードしている間、戻り値の型は重要ではありません。あいまいさがないことを確認する必要があります!
唯一の方法Javaは、引数リストのタイプを区別することにより、どのメソッドを呼び出すかを知ることができます。コンパイラが同じ名前と同じ引数タイプの2つのメソッドを許可する場合、どちらを呼び出すかを決定します。
コンパイラはメソッドを区別するときに戻り値の型を考慮しないため、戻り値の型が異なる場合でも同じシグネチャで2つのメソッドを宣言することはできません。
関数の実行を認識している場合、関数を呼び出すときに定義部分が実行され、最後にreturnステートメントが必要になるため、関数の定義全体の後にreturnが来ると言うことに気付くでしょう。同じ名前で同じタイプでnoの関数がさらにあります。関数の名前とパラメーターが同じであるため、コンパイラーはどの引数を呼び出すかをどのように知るかを呼び出したときに引数の最初に呼び出すとき、すべての焦点は引数と関数名になり、関数定義の完了後、最後にreturnステートメントを扱います。
コンパイル時エラーは、実行時エラーよりも優れています。したがって、Javaコンパイラーは、同じパラメーターを持つ同じメソッドを宣言すると、コンパイラー時間エラーをレンダリングします。