使用参数版本可以
- 给该功能用户的更多信息
- 限制您可以编写的程序数量(免费的错误检查)
作为一个随机示例,假设我们有一种方法可以计算二次方程的根
int solve(int a, int b, int c) {
// My 7th grade math teacher is laughing somewhere
}
然后,您希望它可以处理其他类型的数字,例如int
。你可以写类似
Num solve(Num a, Num b, Num c){
...
}
问题是,这并没有说明您想要的内容。它说
给我任何3件与数字类似的东西(不一定以相同的方式),我会给你一些数字
我们不能这样做int sol = solve(a, b, c)
,如果a
,b
和c
是int
因为我们不知道该方法会返回一个int
到底!如果我们想以更大的表达方式使用该解决方案,则会导致一些尴尬的跳舞,并垂头丧气,祈祷。
在函数内部,有人可能会给我们一个浮点数,一个bigint和一个度数,我们必须将它们相加并相乘。我们想静态地拒绝此操作,因为这3个类之间的操作将变得毫无用处。a.plus(b) = b.plus(a)
度数是mod 360,因此不会发生类似的欢闹。
如果我们将参数多态性与子类型结合使用,则可以排除所有这些情况,因为我们的类型实际上表明了我们的意思
<T : Num> T solve(T a, T b, T c)
或用“如果给我某种数字类型,我可以用这些系数求解方程”。
这在很多其他地方也有涉及。的示例的另一个良好来源是函数,其抽象超过某种容器,丙氨酸的reverse
,sort
,map
等。