parametric polymorphism
因此,我一直在搜索有关and之间主要区别的文档 adhoc-polymorphism
,但我仍然有一些疑问。
例如,像head
Collections 中的方法,显然是参数多态性,因为用于获取 List[Int] 中的头部的代码与任何其他 List 中的相同。
List[T] {
def head: T = this match {
case x :: xs => x
case Nil => throw new RuntimeException("Head of empty List.")
}
}
(不确定这是否是 head 的实际实现,但没关系)
另一方面,类型类被认为是临时多态性。因为我们可以提供不同的实现,限制在类型上。
trait Expression[T] {
def evaluate(expr: T): Int
}
object ExpressionEvaluator {
def evaluate[T: Expression](value: T): Int = implicitly[Expression[T]].evaluate(value)
}
implicit val intExpression: Expression[Int] = new Expression[Int] {
override def evaluate(expr: Int): Int = expr
}
ExpressionEvaluator.evaluate(5)
// 5
在中间,我们有像过滤器这样的方法,它们是参数化的,但我们可以通过提供不同的功能来提供不同的实现。
List(1,2,3).filter(_ % 2 == 0)
// List(2)
过滤器、映射等方法是否被视为临时多态性?为什么或者为什么不?