使用单一方法隐式转换函数到特征

Implicit conversion function to trait with a single method

Scala 2.11.4

我有以下特点

trait MyTrait{
   def met(msg: String): Unit
}

和class

class MyClass{

   def ac(mt: MyTrait) = {
      //do some job
   }
}

现在,我想调用 ac 如下:

val myClass = new MyClass
myClass.as((msg: String) => println(msg)) //meaning that just print out Strings to stdout

所以,我尝试将隐式转换添加到 MyTrait:

trait MyTrait {
  def met(msgString: String): Unit
  implicit def function2MyTrait(f: String => Unit): MyTrait = new MyTraitImpl(f)

  private[this] class MyTraitImpl(f: String => Unit) extends MyTrait{
    override def met(msgString: String): Unit = f(msgString)
  }
}

但它拒绝编译:

Error:(16, 89) type mismatch;
 found   : String => Unit
 required: com.test.trace.MyTrait

我来自Java 8. Scala有没有办法做这样的事情?

  1. function2MyTrait 需要住在伴生对象中:

    trait MyTrait {
      def met(msgString: String): Unit
    }
    object MyTrait {
      implicit def function2MyTrait(f: String => Unit): MyTrait = new MyTraitImpl(f)
    
      private[this] class MyTraitImpl(f: String => Unit) extends MyTrait{
        override def met(msgString: String): Unit = f(msgString)
      }
    }
    
  2. 这在 Scala 2.12 中将不再是必需的,因为它将允许使用 lambda 来实现 MyTrait 而无需经过 String => Unit.