类型约束实现为以下类型:
abstract class <:<[-From, +To] extends Function1[From, To]
object <:< {
implicit def conforms[A] = new (A <:< A) { def apply(x: A) = x }
}
我们在代码中使用这样的证据:
def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) =
(it.head, it.last)
当我清除apply
方法时,编译器说it
不包含head
和last
,而隐式类型解析已经成功。这意味着C是Iterable [A]的子类型。但编译器无法推断出这一点。这只是Scala的类型推断不够强大吗?
答案 0 :(得分:0)
我不明白......你觉得这个错了什么。它工作正常,
scala> :pa
// Entering paste mode (ctrl-D to finish)
def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last)
// Exiting paste mode, now interpreting.
firstLast: [A, C](it: C)(implicit ev: <:<[C,Iterable[A]])(A, A)
scala> firstLast(List(1,2,3))
res0: (Int, Int) = (1,3)