2016-08-25 62 views
1
Scala 2.11.4 

我有以下特点隐式转换功能,通过单一方法特质

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

和类

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呢?

回答

3
  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. 这将不再在斯卡拉2.12是必要的,因为这将允许使用lambda表达式来实现MyTrait不通过String => Unit去。

+0

其实刚刚试过了,现在编译好了。但是我之前没有遇到过“特质”的伴侣对象。它是如何共同的?它与我们在Java 8中有什么相似(接口中的静态方法)? – stella

+2

是的,它类似于接口中的静态方法。与Java 8的不同之处在于它从一开始就存在(或者至少在很长一段时间内),所以它被更广泛地使用。就伴侣客体而言,类别和性状之间没有区别。 –

+1

这是怎么回事:'implicit def function2MyTrait(f:String => Unit):MyTrait = new MyTrait {def met = f}'我读它的方式是创建一个扩展MyTrait的匿名类,其中的方法会见就落实了。但是编译器关于未实现的会话。 – Samar