任何和参数多态scala之间的差异?

时间:2015-03-11 21:16:25

标签: 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)
  }

2 个答案:

答案 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 }