Dlaczego nie można przeciążać funkcji po prostu przez zmianę typu zwracanego? Czy to się zmieni w przyszłej wersji Java?
Nawiasem mówiąc, czy jest to możliwe w C ++?
java
overloading
nunos
źródło
źródło
Odpowiedzi:
Nie da się tego zrobić w Javie ani w C ++. Powodem jest to, że sama wartość zwracana nie jest wystarczająca, aby kompilator mógł dowiedzieć się, którą funkcję wywołać:
źródło
float
, to jestdouble
.foo();
bez zwracanego typu byłby niejednoznaczny, niekoniecznie jest powodem, aby zabronić tego jako przeciążenia. Istnieją argumenty, które mogą powodować niejednoznaczność (np.foo(null);
), Ale nie powoduje to, że przeciążenie jest z natury nieważne.Powodem jest to, że przeciążenia w Javie są dozwolone tylko dla metod z różnymi sygnaturami .
Zwracany typ nie jest częścią podpisu metody, dlatego nie można go użyć do odróżnienia przeciążeń.
Zobacz Definiowanie metod z samouczków Java.
źródło
calculateAnswer(double, int, double, double)
”. Zobacz, że zwracany typ nie jest uwzględniony, @konmik.Przed Java 5.0, kiedy zastępujesz metodę, zarówno parametry, jak i zwracany typ muszą dokładnie pasować. W Javie 5.0 wprowadza nową funkcję zwaną kowariantnym typem zwrotu. Możesz przesłonić metodę z tym samym podpisem, ale zwraca podklasę zwróconego obiektu. Innymi słowy, metoda w podklasie może zwrócić obiekt, którego typ jest podklasą typu zwróconego przez metodę z tym samym podpisem w nadklasie.
źródło
Overloaded
metody w java mogą mieć różne typy zwracanych wartości, biorąc pod uwagę, że argument jest inny.Sprawdź przykładowy kod.
źródło
Kompilator nie bierze pod uwagę zwracanego typu podczas różnicowania metod, więc nie można zadeklarować dwóch metod z tym samym podpisem, nawet jeśli mają inny typ zwracany.
źródło
Zwracany typ nie ma znaczenia podczas przeciążania metody. Musimy tylko upewnić się, że nie ma dwuznaczności!
Jedynym sposobem, w jaki Java może wiedzieć, którą metodę wywołać, jest rozróżnienie typów listy argumentów. Gdyby kompilator dopuścił dwie metody o tej samej nazwie i tych samych typach argumentów, nie byłoby możliwości określenia, którą z nich powinien wywołać.
źródło
Kompilator nie bierze pod uwagę zwracanego typu podczas różnicowania metod, więc nie można zadeklarować dwóch metod z tym samym podpisem, nawet jeśli mają inny typ zwracany.
Jeśli jesteś świadomy wykonywania funkcji, będziesz świadomy, że gdy wywołujemy funkcję, część definicji wykonuje i na koniec wymagamy instrukcji return, stąd możemy powiedzieć, że powrót następuje po całej definicji funkcji, dlatego jeśli są dwa lub więcej funkcji o tej samej nazwie, tym samym typie i nr. argumentów w momencie wywołania, w jaki sposób kompilator będzie wiedział, który z nich ma zostać wywołany, ponieważ nazwa funkcji i parametry są takie same. W momencie wywołania najpierw skupiamy się na argumentach i nazwie funkcji, a po zakończeniu definicji funkcji w końcu mamy do czynienia z instrukcją return.
Błąd kompilacji jest lepszy niż błąd czasu wykonywania. Tak więc kompilator java renderuje błąd czasu kompilatora, jeśli zadeklarujesz tę samą metodę z tymi samymi parametrami.
źródło
nie, naprawdę nie jest możliwe, w ten sposób możesz przeciążyć tylko przez brak argumentów lub typ danych argumentów
źródło