Mit der parametrischen Version gibt
- Weitere Informationen für die Benutzer der Funktion
- Beschränkt die Anzahl der Programme, die Sie schreiben können (kostenlose Fehlerprüfung)
Nehmen wir als zufälliges Beispiel an, wir haben eine Methode, die die Wurzeln einer quadratischen Gleichung berechnet
int solve(int a, int b, int c) {
// My 7th grade math teacher is laughing somewhere
}
Und dann möchten Sie, dass es auch mit anderen Arten von Zahlen wie anderen Dingen funktioniert int
. Sie können so etwas schreiben
Num solve(Num a, Num b, Num c){
...
}
Das Problem ist, dass dies nicht sagt, was Sie wollen. Es sagt
Gib mir 3 beliebige Dinge, die nummeriert sind (nicht unbedingt auf die gleiche Weise) und ich gebe dir eine Art Nummer zurück
Wir können so etwas wie int sol = solve(a, b, c)
if a
, nicht machen b
und c
sind int
s, weil wir nicht wissen, dass die Methode int
am Ende eine zurückgibt! Dies führt zu etwas umständlichem Tanzen mit Niederwerfen und Beten, wenn wir die Lösung in einem größeren Ausdruck verwenden möchten.
Innerhalb der Funktion könnte uns jemand einen Float, einen Bigint und Grade geben, und wir müssten sie addieren und miteinander multiplizieren. Wir möchten dies statisch ablehnen, da die Operationen zwischen diesen drei Klassen nur Kauderwelsch sind. Grad sind mod 360, also wird es nicht so sein, dass a.plus(b) = b.plus(a)
ähnliche Heiterkeiten auftauchen.
Wenn wir den parametrischen Polymorphismus mit Subtypisierung verwenden, können wir dies alles ausschließen, da unser Typ tatsächlich sagt, was wir meinen
<T : Num> T solve(T a, T b, T c)
Oder in Worten "Wenn Sie mir einen Typ geben, der eine Zahl ist, kann ich Gleichungen mit diesen Koeffizienten lösen".
Dies kommt auch an vielen anderen Orten vor. Eine weitere gute Quelle für Beispiele sind Funktionen , die abstrakt über eine Art Container, ala reverse
, sort
, map
etc.