2016-04-07 43 views
2

çalışır belirtmek mümkün mü:o yöntemleri Verilen fonksiyon aşırı Java

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

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

buna özyinelemeli foo(int i){return foo(int i);} çalışmaz böylece foo(int i){return foo(double d);} yazmak mümkün mü?

Anladığım kadarıyla bu hiç bir şekilde tavsiye edilmezdi, hangi mekanizmaların izin verdiği veya izin vermediğini bulmak için araştırıyorum?

+2

'String [] foo (int i) {return foo (çifte) i);}' ' –

+0

İstediğiniz yönteme uyacak şekilde açıkça yayınlayabilirsiniz. – dambros

+0

Uygun argümanları belirterek istediğiniz aşırı yüklemeyi diyorsunuz. Eğer 'int' parametresiyle foo 'çağırırsanız, foo (int) '; eğer 'double' parametresiyle çağırırsanız, foo (double) 'olarak adlandırılır. –

cevap

2

Geçerli bir parametreyi ileterek çağrılacak yöntemi örtülü olarak belirtirsiniz.

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

Otomatik olarak gerçekleşmelidir. Aşırı yüklemenin ardındaki düşünce, yöntem imzalarının, özellikle yöntem parametreleriyle tam olarak aynı olmamasıdır. Bir parametre olarak double değerini girdiğinizde, foo(double d)'u arayacaktır. Parametre olarak int'u ilettiğinizde foo(int i)'u arayacaktır. double yönteminin çağrıldığından emin olmak için double'a (double)x kodunu kullanarak x tamsayıdır) kullanabilirsiniz.

3

String[] foo(int i){return foo((double) i);}. Bu şekilde, derleyiciye 'u foo(int i)'dan çağırmasını açıkça söylüyorsunuz. Yani tekrarlayıcı bir çağrı yapılmayacaktır.

Aşırı yükleme durumunda, bazı parametrelerle bir yöntem çağrıldığında, derleyici geçen argümanlara en uygun olacak yöntemi bulmaya çalışır. Sizin durumunuzda, String[] foo(int i){return foo(i);}, foo(int i) versiyonunu çağırırsanız, translated argümanı için en uygun olduğu için (int tipinde). Bu nedenle, foo'un double sürümünü çağırmak için, derleyiciye geçen argümanın double türünde olduğunu açıkça belirtmeniz gerekir.