我知道参数多态性实际上是有效的,但我很好奇为什么在它的位置使用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)
}
答案 0 :(得分:1)
你的意思是什么不起作用?这看起来很好:
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
,分别如示例所示。)
答案 1 :(得分:0)
在这种情况下确实没有区别,因为你根本不依赖于所包含的类型,只是List
本身的结构。无论T
是什么,长度都是相同的。
如果您想要返回另一个List[T]
,则类型参数很重要。例如:
def takeEveryOther[T](l: List[T]): List[T] =
l.zipWithIndex.collect { case (a, i) if(i % 2 == 0) => a }