假设我有一个函数,取两个值和一个函数作为参数。
def ls[S](a: S, b: S)(implicit evl: S => Ordered[S]): Boolean = a < b
def myfunction[T](a: T, b: T, f:(T,T)=>Boolean) = {
if (f(a, b)) {
println("is ok")
}
else {
println("not ok")
}
}
myfunction(1, 2, ls)
IDE不会给出任何错误消息,但是当我尝试编译并运行时,compliter会给出以下消息:
Error:(14, 19) No implicit view available from S => Ordered[S].
myfunction(1, 2, ls);}
^
那么,有没有办法将类型参数函数作为另一个函数的参数传递?
答案 0 :(得分:2)
首先这是有效的:
myfunction[Int](1, 2, ls)
myfunction(1, 2, ls[Int])
根据我的理解,Scala编译器尝试解析T
的{{1}}类型。
它找到第一个和第二个参数,并乐于将其分配给myfunction
(或其超类型的任何东西)作为最佳匹配。
但是第三个论点说它可以作为参数得到任何东西!然后,Scala编译器必须遵守并确定Int
将为T
。这导致Any
属于S
类型且没有隐式视图Any
您不能将Any => Ordered[Any]
视为定义myfunction
的类型,而是ls
定义ls
的类型。
这就是为什么这会有效,因为您已经知道您想要的T
类型:
f