繁体   English   中英

任何和参数多态性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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM