无法理解Scala的类型推断

时间:2019-04-08 08:20:52

标签: scala

我正在通过学习Scala并发性 它具有以下代码。

package week_parallel.week1.SC_Book

import scala.collection.mutable

object SyncPoolArgs extends App {
  private val tasks = mutable.Queue[() => Unit]()
  object Worker extends Thread {
    setDaemon(true)
    def poll() = tasks.synchronized {
      while (tasks.isEmpty) tasks.wait()
      tasks.dequeue()
    }
    override def run() = while (true) {
      val task = poll()
      task()
    }
  }
  Worker.start()
  def asynchronous(body: =>Unit) = tasks.synchronized {
    tasks.enqueue(() => body)
    tasks.notify()
  }

  def sum(x: Int, y:Int) = {println("USING SUM")
    x+y}

  asynchronous { log("Hello ") }
  asynchronous { log("World!") }
  asynchronous { sum(4,5) }
  Thread.sleep(500)
}

所以,我的问题是,如果我们有不带参数且不返回任何值的函数类型的任务,为什么tasks.enqueue(() => body)将求和放入队列中,是否应该检查主体方法签名是否错误?总和。

此外,我尤其无法掌握tasks.enqueue(() => body)如何限制为private val tasks = mutable.Queue[() => Unit]()类型?

1 个答案:

答案 0 :(得分:3)

我认为您可能会对声明感到困惑

body: => Unit

这意味着body是类型Unit的{​​{3}}参数。 不是并不意味着body是一个返回Unit(即body: () => Unit)的函数。

“按名称传递”表示传递到body的表达式直到需要该值时才被求值。评估后,它将返回Unit

由于body的类型为Unit,因此表达式() => body的类型为() => Unit,这是必需的。

在这种情况下,body的实际值为sum(4,5),类型为Int,但是IntUnit兼容,因此没有错误。