使用单一方法隐式转换函数到特征
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有没有办法做这样的事情?
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)
}
}
这在 Scala 2.12 中将不再是必需的,因为它将允许使用 lambda 来实现 MyTrait
而无需经过 String => Unit
.
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有没有办法做这样的事情?
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) } }
这在 Scala 2.12 中将不再是必需的,因为它将允许使用 lambda 来实现
MyTrait
而无需经过String => Unit
.