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でそのようなことを行う方法はありますか?コンパニオンオブジェクトで生活する
実際に試したところ、すぐに問題なくコンパイルされました。しかし、私は前に '形質のための仲間の対象物を見つけたことはありません。どのように一般的ですか?それはJava 8(インタフェースの静的メソッド)にあるものと幾分似ていますか? – stella
はい、インターフェイスの静的メソッドに似ています。 Java 8との違いは、これが最初から(または少なくとも非常に長い間)存在していたため、より広く使用されているということです。コンパニオンオブジェクトに関しては、クラスと特性の間に違いはありません。 –
これはどうしたらうまくいかないのですか? '暗黙のdef function2MyTrait(f:String =>単位):MyTrait = new MyTrait {def met = f}' MyTraitを拡張した匿名クラスが作成され、 metが実装されています。しかし、コンパイラは、実装されていないということに関しては賛成しています。 – Samar