2016-08-25 15 views
1
Scala 2.11.4 

I次のように次のような形質暗黙的な変換機能は、単一の方法で形質に

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. これはString => Unitを経由せずMyTraitを実装するためにラムダを使用できるようにだろうとして、Scalaの2.12に必要なことはもはやできなくなります。

+0

実際に試したところ、すぐに問題なくコンパイルされました。しかし、私は前に '形質のための仲間の対象物を見つけたことはありません。どのように一般的ですか?それはJava 8(インタフェースの静的メソッド)にあるものと幾分似ていますか? – stella

+2

はい、インターフェイスの静的メソッドに似ています。 Java 8との違いは、これが最初から(または少なくとも非常に長い間)存在していたため、より広く使用されているということです。コンパニオンオブジェクトに関しては、クラスと特性の間に違いはありません。 –

+1

これはどうしたらうまくいかないのですか? '暗黙のdef function2MyTrait(f:String =>単位):MyTrait = new MyTrait {def met = f}' MyTraitを拡張した匿名クラスが作成され、 metが実装されています。しかし、コンパイラは、実装されていないということに関しては賛成しています。 – Samar

関連する問題