2016-04-07 7 views
2

で実行するかを指定することは可能です:それは方法を考える機能、オーバーロードのJava

String[] foo(int i){#doSomething;} 

String[] foo(double i){#doesSomethingDifferent;} 

それは再帰的foo(int i){return foo(int i);}を実行しないようにfoo(int i){return foo(double d);} を書くことは可能ですか?

これはどのような方法でも推奨されないと私は理解していますが、どのメカニズムがそれを許可するのか許可しないのかを探していますか?

+2

'' foo(int i){return foo((double)i);} '' –

+0

あなたが望むメソッドに合わせて明示的にキャストすることができます。 – dambros

+0

適切な引数を指定して、必要なオーバーロードを呼び出します。 'int'パラメータで' foo'を呼び出すと、 'foo(int)'を呼び出します。 'double'パラメータで呼び出すと、' foo(double) 'を呼び出します。 –

答えて

2

実際のパラメータを渡すことによって呼び出されるメソッドを暗黙的に指定します。

foo(int i) { return foo(1d); /*it will call foo(double i)*/ } 
foo(int i) { return foo(1); /*recursive call*/ } 
3

自動的に発生するはずです。オーバーロードの背後にある考え方は、メソッドのシグネチャがまったく同じであってはならないということです。特にメソッドのパラメータです。パラメーターとしてdoubleの値を渡すと、foo(double d)が呼び出されます。パラメータとしてintを渡すと、foo(int i)が呼び出されます。 doubleメソッドが呼び出されるようにするには、(double)xを使用してdoubleにキャストすることができます(xは整数)。

3

String[] foo(int i){return foo((double) i);}を試すことができます。このようにして、foo(double d)foo(int i)から呼び出すようにコンパイラに明示しています。したがって、再帰呼び出しは行われません。

オーバーロードの場合、あるパラメータでメソッドが呼び出されると、コンパイラは、渡された引数に最も適したメソッドを見つけようとします。あなたの場合、単にString[] foo(int i){return foo(i);}を呼び出すと、(intの)渡された引数に最適なので、foo(int i)のバージョンが呼び出されます。そのため、のdoubleバージョンを呼び出す理由は、渡された引数の型がdoubleであることをコンパイラに明示的に伝える必要があります。

関連する問題