上下文边界和类

时间:2016-04-13 12:55:58

标签: scala implicit

以下功能定义有什么问题。

def f[A: Ordered] (a: A, b: A): Boolean = a < b 

我得不到符号&lt;。由于Ordered是A的上下文类,因此它无法解析&lt; ?我错过了什么?

2 个答案:

答案 0 :(得分:3)

Ordered不是类型类,而是普通继承的基本特征。

所以你要么更新到......

def f[A <: Ordered[_]](a: A, b: A): Boolean = a < b

...或者您使用保留上下文边界的Ordering类型类:

def f[T : Ordering](a: T, b: T): Boolean = {
  val order = implicitly[Ordering[T]]
  order.lt(a, b)
}

// Or:
def f[T](a: T, b: T)(implicit order: Ordering[T]): Boolean = order.lt(a, b)
  

就我个人而言,我不推荐import scala.math.Ordering.Implicits._(自动魔法内容)的隐式转换。

答案 1 :(得分:2)

Ordered[T]是一个扩展Java中Comparable[T]接口的特性。您可以在要将类的当前实例与该同一类的另一个实例进行比较的类上实现它。您实际需要的是使用Ordering[T]扩展Comparator[T]在Java中。它需要两个元素,并告诉您一个是否小于\等于\大于另一个。当您使用上下文界限时,您可以通过Ordering[T]

访问implicitly
def f[A: Ordering](a: A, b: A): Boolean = implicitly[Ordering[A]].lt(a, b)

正如@ m-z所说,你也可以import scala.math.Ordering.Implicits._使用<方法:

import scala.math.Ordering.Implicits._
def f[A: Ordering](a: A, b: A): Boolean = a < b