メソッドの戻り値の型が署名に含まれていないのはなぜですか?
例
public void method1(String arg){...}
public String method1(String arg){...}
エラーの原因となります。
メソッドの戻り値の型が署名に含まれていないのはなぜですか?
例
public void method1(String arg){...}
public String method1(String arg){...}
エラーの原因となります。
これは、コンパイラがすべてのコンテキストでオーバーロードを把握できないためです。
たとえば、
String x = method1("aaa");
コンパイラは、2 番目のオーバーロードを探していることを認識しています。ただし、電話すると
method1("aaa");
このように、コンパイラは 2 つのメソッドのどちらを呼び出したいかわかりません。これは、返されるメソッドを呼び出しString
て結果を破棄しても問題ないためです。このようなあいまいさを避けるために、Java は戻り値の型だけが異なるオーバーロードを禁止しています。
あなたの質問は、タイトルの特定のプログラミング言語に対応していないため (タグで対応していることはわかっています)、最近のSwiftの経験を共有します。Swift関数/メソッド シグネチャでは、実際には戻り値の型が含まれます。したがって、戻り値の型を明示的に指定せずにこの関数/メソッドを呼び出した場合にのみ、コンパイラはエラーをスローします。
func some() -> Bool {
return true;
}
func some() -> Int {
return 1;
}
let valBool: Bool = some()
let valInt: Int = some()
// this doesn't work: Ambiguous use of 'some'
some()
このSwiftに加えて、さらに興味深いものにします。パラメーター名が異なる場合にのみ、同じパラメーターと戻り値の型を持つ 2 つの関数/メソッドを使用できます。たとえば、次のようになります。
func some(#foo: Bool) -> Bool {
return foo;
}
func some(#bar: Bool) -> Bool {
return bar;
}
some(foo: true)
some(bar: false)
したがって、メソッドシグネチャでセマンティックな差別化を提供します
アップデート。Swift 2.0 の外部パラメータ名が変更されたため、同じ名前であっても、外部名とローカル名を 2 回指定する必要があります。
func some(foo foo: Bool) -> Bool {
return foo;
}
func some(bar bar: Bool) -> Bool {
return bar;
}
some(foo: true)
some(bar: false)
戻り値の型だけでメソッドをオーバーロードすることはできません。それは単に違法です。戻り値の型を使用したメソッドのオーバーロードが正当であり、2 つのメソッドを定義したと仮定してみましょうmethod1
。ここで、以下を返すそれを呼び出したいと思いますString object
:
String string = method1(sth);
理論的には、JVM は呼び出すメソッドを認識することができますが、そのような呼び出しはどうでしょうか。
method1(sth);
ご覧のとおり、両方のメソッドを呼び出すことができ、そのような操作は明確です。JVM は、呼び出す必要があるメソッドを認識していません。これが、そのような過負荷が禁止されている理由です。
次のような場合、オーバーロードされたメソッドのどれを呼び出す必要があるかを解決できないためです。
public static void main(String... args) {
method1("aaa");
}
関数をプロシージャとして呼び出すことができます。method1("arg");
ここで、method1 はリストの 2 番目のメソッドです ( String method1(String arg){}
)。その場合、コンパイラはそれを最初のものと区別できなくなります ( void method1(String arg){}
)。
メソッドのオーバーロードは、戻り値の型ではなく、引数の数と型に基づいてチェックされます。そのため、エラーが発生します。