Scala对类型别名的隐式转换

卡米尔·克洛奇(Kamil Kloch)

定义

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-使用Lambda类型:

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

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

有关Lambda类型的更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章