【问题标题】:scala parameterized type with constraint appearing after the colon?冒号后出现约束的scala参数化类型?
【发布时间】:2015-11-23 20:43:36
【问题描述】:

我正在查看 Sorting.scala 的源代码,并对 源sn-p中最后一个方法的定义如下。

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) } //<<??

类型参数“K”似乎被限制为一个子类型(也许?) 'Ordering'...但我从未见过这种语法。

我会有点(不是双关语)理解如果 该方法的定义如下:

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

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

提前谢谢...

【问题讨论】:

标签: scala type-parameter parameterized-types


【解决方案1】:

原来这是一个“上下文绑定”。 在我现在正在阅读“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

【讨论】:

  • 上下文边界经常与type classes 一起使用(在本例中)——事实上,我想说,类型类是引入它们的原因。
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多