以下代码使用上下文绑定:
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确实可以采用类型参数,我认为泛型类型必须采用类型参数。
我在这里是否会错过一些特殊规则?
谢谢
答案 0 :(得分:4)
[Left: Right]
(上下文绑定)需要类型Left
和k
类型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
。