scala参数化类型,冒号后出现约束?

时间:2015-08-29 07:30:48

标签: scala type-parameter parameterized-types

我正在查看Sorting.scala的来源,并对此很好奇 下面的源代码段中的最后一个方法的定义。

object Sorting {
  /** Quickly sort an array of Doubles. */
  def quickSort(a: Array[Double]) { sort1(a, 0, a.length) }

  /** Quickly sort an array of items with an implicit Ordering. */
  def quickSort[K: Ordering](a: Array[K]) { sort1(a, 0, a.length) } //<<??

类型参数&#39; K&#39;似乎被限制为一个子类型(也许?) &#39;订购&#39; ...但我从未见过这种语法。

我想(如果没有双关语)会理解 该方法定义如下:

  def quickSort[K <% Ordering[K]](a: Array[K]) { sort1(a, 0, a.length) }

但是我对一个只有冒号的约束的含义感到困惑。任何指向相关文档或进一步(解释)示例的链接都很棒。

提前致谢...

1 个答案:

答案 0 :(得分:2)

原来这是一个'上下文绑定'。 在一本非常好的书中找到了答案,我现在正在阅读“Scala编程”。来自第5章。关于隐含的论点......这是一个例子 解释了发生了什么:

case class MyList[A](list: List[A]) {
  def sortBy1[B](f: A => B)(implicit ord: Ordering[B]): List[A] =
    list.sortBy(f)(ord)

  def sortBy2[B : Ordering](f: A => B): List[A] =
    list.sortBy(f)(implicitly[Ordering[B]])
}

val list = MyList(List(1,3,5,2,4))
list sortBy1 (i => -i)
list sortBy2 (i => -i)

类型参数B:Ordering称为上下文绑定。它意味着第二个隐式参数列表采用了Ordering [B]实例。

更多here