类型别名的 Scala 隐式转换

Scala implicit conversion for type aliases

定义

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。为什么隐式转换在前一种情况下不起作用?

您的隐式 def 需要一个接收一个类型参数的类型,即 TA[T]

您的声明:val ta: TA[Double] = ... 本身就是一个类型,不接受任何类型参数。所以编译器不会使用你的隐式 def 来类型检查这个。

结论是您对采用类型参数的类型进行了隐式类型转换,而 TA[Double] 不采用任何类型参数。

解决方案:

1 - 替换隐式类型转换以接收 Function1:

  implicit class TAOps[T](a: T => Int) {
    def foo: Unit = {
      println("TA")
    }
  }

2 - 使用类型 lambdas:

  implicit class TAOps[T](a: ({type Alias = TA[T]})#Alias) {
    def foo: Unit = {
      println("TA")
    }
  }

此处您创建的类型已柯里化。因此,编译器现在会将此隐式转换应用于匹配的类型,它不再期望接收 1 个类型参数的类型。

更多关于 Type Lambdas