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 ++?
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 ++?
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ć:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, to jest double
.
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.
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.
Overloaded
metody w java mogą mieć różne typy zwracanych wartości, biorąc pod uwagę, że argument jest inny.
Sprawdź przykładowy kod.
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
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ć.
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.
nie, naprawdę nie jest możliwe, w ten sposób możesz przeciążyć tylko przez brak argumentów lub typ danych argumentów