次のコードを検討してください ( Ideoneで直接実行できます)。
object Main extends App {
def foo[T](code: => T) : Runnable = new Runnable { def run = code }
override def main(args: Array[String]): Unit = {
val x: Runnable = foo(() => {
System.out.println("b")
})
val y: Runnable = foo({
System.out.println("d")
})
System.out.println("a")
x.run()
System.out.println("c")
y.run()
System.out.println("e")
}
}
これa c d e
は、最初のラムダが に正常に渡されfoo
たが、 を呼び出したときに実行されなかったことを意味しますx.run()
。ただし、2 つ目は正常に実行されます。
そのラッピングを削除してRunnable
これらのラムダを直接実行すると、両方とも機能します。Java ライブラリの Scala バインディングを使用していたときに、この動作に遭遇しました。
ここで何が起こっているのですか?に何が起こったx
のですか。正しい値があるのに何もしないのはなぜですか?