考虑以下代码(您可以直接在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
,这意味着第一个 lambda 已成功传递给foo
,但在我调用时未执行x.run()
。但是,第二个已成功执行。
如果我删除包装Runnable
并直接运行这些 lambda,它们都可以工作。我在使用 Java 库的 Scala 绑定时遇到了这种行为。
这里发生了什么?发生了什么x
,为什么它有一些正确的值但什么也不做?