Korzystanie z wersji parametrycznej daje
- Więcej informacji dla użytkowników funkcji
- Ogranicza liczbę programów, które możesz napisać (bezpłatne sprawdzanie błędów)
Jako przypadkowy przykład, załóżmy, że mamy metodę, która oblicza pierwiastki równania kwadratowego
int solve(int a, int b, int c) {
// My 7th grade math teacher is laughing somewhere
}
A potem chcesz, aby działał na innych rodzajach, takich jak rzeczy poza int
. Możesz napisać coś takiego
Num solve(Num a, Num b, Num c){
...
}
Problem polega na tym, że nie mówi to, co chcesz. To mówi
Daj mi 3 dowolne rzeczy, które są liczbami (niekoniecznie w ten sam sposób), a dam ci jakąś liczbę
Nie możemy zrobić coś jak int sol = solve(a, b, c)
gdyby a
, b
i c
to int
dlatego, że nie wiemy, że metoda będzie zwracaćint
w końcu! Prowadzi to do niezręcznego tańca z upuszczaniem i modlitwą, jeśli chcemy zastosować rozwiązanie w szerszym znaczeniu.
Wewnątrz funkcji ktoś mógłby podać nam liczbę zmiennoprzecinkową, bigint i stopnie, a my musielibyśmy je dodać i pomnożyć razem. Chcielibyśmy to statycznie odrzucić, ponieważ operacje między tymi 3 klasami będą bełkotliwe. Stopnie są mod 360, więc tak nie będziea.plus(b) = b.plus(a)
i podobne podobieństwa się pojawią.
Jeśli zastosujemy polimorfizm parametryczny z podtypami, możemy wykluczyć to wszystko, ponieważ nasz typ faktycznie mówi, co mamy na myśli
<T : Num> T solve(T a, T b, T c)
Lub słowami „Jeśli podasz mi jakiś typ, który jest liczbą, mogę rozwiązać równania z tymi współczynnikami”.
To pojawia się również w wielu innych miejscach. Innym dobrym źródłem przykładów są funkcje, które streszczenie nad jakimś pojemniku, Ala reverse
, sort
, map
, itd.