定义
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]
value foo is not a member of ammonite.$sess.cmd1.TA[Double]
TAOps(ta).foo()
打印 TA . 为什么隐式转换在前一种情况下不起作用?
TA
隐式定义需要一个接收一个类型参数的类型,即 TA[T]
TA[T]
val ta: TA[Double] = ... 它本身就是一个类型,不接受任何类型参数。因此编译器不会使用隐式def进行类型检查。
val ta: TA[Double] = ...
结论对于接受类型参数的类型,您有一个隐式类型转换,并且 TA[Double]
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") } }
更多信息 Type Lambdas