定义
type TA[T] = T => Int
implicit class TAOps[T](a: TA[T]) {
def foo(): Unit = {println("TA")}
}
val ta: TA[Double] = x => x.toInt
现在,
ta.foo()
无法使用消息value foo is not a member of ammonite.$sess.cmd1.TA[Double]
,
显式调用
TAOps(ta).foo()
打印TA
。为什么隐式转换在前一种情况下不起作用?
答案 0 :(得分:2)
您的隐式def期望一种类型接收一个类型参数,即TA[T]
您的声明:val ta: TA[Double] = ...
是一种自我类型,并且不会采用任何类型参数。所以编译器不会使用你的隐式def来键入check this。
结论对于采用类型参数且TA[Double]
不采用任何类型参数的类型,您有隐式类型转换。
Function1
: implicit class TAOps[T](a: T => Int) {
def foo: Unit = {
println("TA")
}
}
implicit class TAOps[T](a: ({type Alias = TA[T]})#Alias) {
def foo: Unit = {
println("TA")
}
}
这里你创建的类型是curried。因此,编译器现在将此隐式转换应用于匹配的类型,不再期望接收1个类型参数的类型。
更多关于Type Lambdas