Javaスタイルの匿名コールバックには、定型文が比較的多く含まれており、読みづらいことがあります。Javaコールバックのような匿名オブジェクトではなく、Scala関数を使用します。
workExpression
代わりの
new SomeIF {
@Override public someType doRun() {
return workExpression
}
}
可能な解決策は何のようなものを持っていいだろうか?
Javaスタイルの匿名コールバックには、定型文が比較的多く含まれており、読みづらいことがあります。Javaコールバックのような匿名オブジェクトではなく、Scala関数を使用します。
workExpression
代わりの
new SomeIF {
@Override public someType doRun() {
return workExpression
}
}
可能な解決策は何のようなものを持っていいだろうか?
可能な解決策は、機能をレガシーコールバックタイプに変換するために、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"))
}
}
したがって、一つは読みやすくするためにそのコードで使用される一般的なコールバックタイプのヘルパー形質を作成することができます。
単一のメソッドを使用してクロージャをインターフェイスに自動的に変換することは、将来のバージョンのScalaで行われる可能性があります。http://www.scala-lang.org/node/8744これは、現在必要な暗黙の定型文を避けるでしょう。
すばらしいニュース、ありがとう! – ron
と質問はありますか? – Arne
@Arne:明示的な質問を編集して追加しましたが、暗黙のうちに推論された可能性があります。私はブログのエントリーを書くことができましたが、私はこれを共有しました(そして、私が見つけた1つの答え)。 – ron
明らかにこれについてブログしている誰か(http://www.tikalk.com/incubator/blog/simulating-sam-closures-scala)が、私はそれがSAMと呼ばれていたことを知らなかったので、私はGoogleでそれを見つけることができませんでしたアレクセイのポストまで閉鎖。 – ron