Scala隐式转换类型别名

时间:2017-08-23 13:37:00

标签: scala type-alias implicits

定义

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

1 个答案:

答案 0 :(得分:2)

您的隐式def期望一种类型接收一个类型参数,即TA[T]

您的声明:val ta: TA[Double] = ...是一种自我类型,并且不会采用任何类型参数。所以编译器不会使用你的隐式def来键入check this。

结论对于采用类型参数且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")
    }
  }

这里你创建的类型是curried。因此,编译器现在将此隐式转换应用于匹配的类型,不再期望接收1个类型参数的类型。

更多关于Type Lambdas