代码之家  ›  专栏  ›  技术社区  ›  Kamil Kloch

类型别名的Scala隐式转换

  •  3
  • Kamil Kloch  · 技术社区  · 7 年前

    定义

    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 回复  |  直到 7 年前
        1
  •  2
  •   pedromss    7 年前

    隐式定义需要一个接收一个类型参数的类型,即 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")
        }
      }
    

    更多信息 Type Lambdas

    推荐文章