Защо типът връщане не се взема предвид при разграничаване на методите?

Възможен дубликат:
Java - защо без претоварване на метод, базиран на върнат тип?

Компилаторът не взема предвид типа на връщане, когато разграничава методите, така че не можете да декларирате два метода с еднаква сигнатура, дори ако имат различен тип на връщане.
Урок за Java

Защо е това?


person Silent Warrior    schedule 16.06.2010    source източник


Отговори (5)


Тъй като не е необходимо да задавате резултата, когато искате да изпълните метод. Как тогава компилаторът ще знае кои от претоварените искате да извикате? Ще има неяснота.

person BalusC    schedule 16.06.2010
comment
Какво се случва с върнатите стойности, ако не са присвоени? Просто получават ли GC? - person Pierreten; 16.06.2010
comment
@Pierreten: Ако не се споменава другаде (отвътре в метода например), тогава да. - person BalusC; 16.06.2010

Защото не можете да разберете само от извикването на метода какъв трябва да бъде типът на връщането. Компилаторът трябва да може да каже, използвайки само информация в сайта за повикване, какъв метод да извика. Върнатите стойности може да бъдат отхвърлени, така че като цяло не можете да знаете, че има върната стойност и какъв е нейният тип. става още по-объркващо, след като започнете да мислите за принуждавания на типове (short->int) или кастинги.

По принцип, когато компилаторът види извикване на метод, той знае, че всички аргументи трябва да са там, за да бъде валидно извикване на метод, така че може да използва тези аргументи, за да намери правилния метод за извикване. Но върнатите стойности няма да бъдат известни по време на извикването и дори типът на върнатата стойност може да не бъде открит.

person luke    schedule 16.06.2010

Тъй като извикващият метод ще трябва да предаде връщания тип на извикания метод.

Така че имате

Public Integer doStuff(String thing) { };

и

Public Double doStuff(String thing) { };

Класът, извикващ doStuff, трябва да каже на класа да използва doStuff, който приема низ (вече го прави) и връща Double (не го прави).

Причината ЗАЩО Java прави това? За да предотвратя ужасен код, както изброих по-горе, предполагам :) Претоварването е лесно да се направи бъркотия и не съм сигурен, че виждам ползата от случая по-горе.

person bwawok    schedule 16.06.2010

Всеки даден сайт за обаждания би могъл успешно да използва редица различни типове връщане, най-малкото поради полиморфизъм и автоматично (не)боксиране, така че това или ще се нуждае от правила за справяне с двусмислени случаи, или ще работи само при прости обстоятелства.

person pdbartlett    schedule 16.06.2010

Просто исках да отбележа, че - макар да не е възможно в Java - Ada поддържа претоварване, което се основава само на типове връщане. И все пак най-доброто обяснение на Google за това как работи това е публикация за препълване на стека:

Претоварване на функцията по тип връщане?

person nd.    schedule 16.06.2010