![](/img/trans.png)
[英]Difference between Ad-hoc polymorphism and Parametric polymorphism in Scala
[英]Difference between any and parametric polymorphism scala?
我知道参数多态性实际上是有效的,但是我很好奇为什么在其位置使用Any无效。 例如第一个功能如何
def len[T] (l:List[T]):Int =
l match {
case Nil => 0
case _ :: t => 1 + len(t)
}
与这个不同吗?
def len (l:List[Any]):Int =
l match {
case Nil => 0
case _ :: t => 1 + len(t)
}
这是什么意思? 这看起来很好:
len(List('a,'b,'c))
// res0: Int = 3
在您的示例中,实际上没有什么区别,因为您实际上并没有使用列表的内容,而是想像一下稍微不同的功能:
def second[T](l: List[T]): Option[T] =
l match {
case Nil => None
case _ :: Nil => None
case _ :: x :: _ => Some(x)
}
println(second(List(1,2,3)).map(_ + 5)) // Some(7)
println(second(List(List('a,'b,'c), List('d,'e))).map(_.head)) // Some('d)
如果您对Any
尝试,则除了Option[Any]
之外,您将无法获得任何其他信息,因此编译器将不允许您对结果做任何有用的事情(例如将其添加到Int
或调用.head
,分别在示例中)。
在这种情况下,实际上没有什么区别,因为您根本不依赖于所包含的类型,仅依赖于List
本身的结构。 不管T
是多少,两种长度的长度都相同。
如果要返回另一个List[T]
则type参数将很重要。 例如:
def takeEveryOther[T](l: List[T]): List[T] =
l.zipWithIndex.collect { case (a, i) if(i % 2 == 0) => a }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.