2011-07-13 4 views
2

Javaスタイルの匿名コールバックには、定型文が比較的多く含まれており、読みづらいことがあります。Javaコールバックのような匿名オブジェクトではなく、Scala関数を使用します。

workExpression 

代わりの

new SomeIF { 
    @Override public someType doRun() { 
     return workExpression 
    } 
} 

可能な解決策は何のようなものを持っていいだろうか?

+5

と質問はありますか? – Arne

+0

@Arne:明示的な質問を編集して追加しましたが、暗黙のうちに推論された可能性があります。私はブログのエントリーを書くことができましたが、私はこれを共有しました(そして、私が見つけた1つの答え)。 – ron

+0

明らかにこれについてブログしている誰か(http://www.tikalk.com/incubator/blog/simulating-sam-closures-scala)が、私はそれがSAMと呼ばれていたことを知らなかったので、私はGoogleでそれを見つけることができませんでしたアレクセイのポストまで閉鎖。 – ron

答えて

7

可能な解決策は、機能をレガシーコールバックタイプに変換するために、implicit defを使用しています。たとえば、次のようにいくつかのコードを扱うとき

// Required by some API 
trait Callable[A] { 
    def call(): A 
} 

trait Processor[A,B] { 
    def process(a: A): B 
} 

// Our helper trait 
trait MyImplicits { 
    implicit def funToCallable[A](f:() => A) = new Callable[A]() { 
    def call() = f() 
    } 

    implicit def funToProcessor[A,B](f: (A) => B) = new Processor[A,B]() { 
    def process(a: A) = f(a) 
    } 

} 

object App extends MyImplicits { 

    def main(args: Array[String]) { 
    // Traditional usage 
    runSomeCallable(new Callable[String]() { 
     def call() = "World" 
    }) 

    runSomeProcessor(new Processor[String,Int] { 
     def process(a: String) = a.toInt * 2 
    }) 

    // Usage with implicits 
    runSomeCallable(() => "Scala World") 

    runSomeProcessor((s: String) => s.toInt * 2) 
    } 

    // Methods defined by some foreign API 
    def runSomeCallable[A](callable: Callable[A]) { 
    println("Hello "+callable.call()) 
    } 

    def runSomeProcessor(processor: Processor[String,Int]) { 
    println("From 1 to "+processor.process("1")) 
    } 

} 

したがって、一つは読みやすくするためにそのコードで使用される一般的なコールバックタイプのヘルパー形質を作成することができます。

2

単一のメソッドを使用してクロージャをインターフェイスに自動的に変換することは、将来のバージョンのScalaで行われる可能性があります。http://www.scala-lang.org/node/8744これは、現在必要な暗黙の定型文を避けるでしょう。

+0

すばらしいニュース、ありがとう! – ron

関連する問題