对于上下文绑定,排序不能采用参数类型

时间:2017-07-01 02:41:53

标签: scala

以下代码使用上下文绑定:

def max[T: Ordering](a: T, b: T): T = {
  val ord = implicitly(Ordering[T])
  if (ord.compare(a, b) > 0) a else b
}

[T:Ordering]部分,如果我写的是,Ordering不接受type参数 [T:Ordering[T]],编译器抱怨Ordering不能接受类型参数。

但是Ordering确实可以采用类型参数,我认为泛型类型必须采用类型参数。

我在这里是否会错过一些特殊规则?

谢谢

1 个答案:

答案 0 :(得分:4)

[Left: Right]上下文绑定)需要类型Leftk类型Right的类型k -> *。也就是说,Left是某种类型或类型构造函数,Right是类型构造函数,可以将Left作为参数来生成具体类型。因此,Right永远不是具体类型,但Right[Left]始终是。

因为所有这些都可能是愚蠢的胡言乱语:[T: Ordering]去了implicit ord: Ordering[T],这有效,但[T: Ordering[T]]去了implicit fail: Ordering[T][T],这是无稽之谈。因此,对于Ordering需要类型参数的声明,我说它 需要一个,但是编写类型参数, >编译器为你做。这就是创建上下文边界的原因,因此当您编写[T: Ordering]时,您不需要两次编写T