得到"错误:类型不匹配;找到:需要单位:()=>单位"在回调上

jaz*_*090 3 types scala callback

我刚刚开始阅读有关scala的教程并且遇到了阻塞.我已经将几个示例合并在一起并且收到错误,但不知道为什么.

import java.text.DateFormat._
import java.util.{Date, Locale}

object FrenchDate {
  def main(args: Array[String]) {
    timer(println(frenchDate))
  }

  def frenchDate():String = {
    val now = new Date
    val df = getDateInstance(LONG, Locale.FRANCE)
    df format now
  }

  def timer(callback: () => Unit) {
    while(true) {callback(); Thread sleep 1000}
  }
}
Run Code Online (Sandbox Code Playgroud)

带来错误

error: type mismatch;
found   : Unit
required: () => Unit
println(frenchDate)
Run Code Online (Sandbox Code Playgroud)

而以下工作

import java.text.DateFormat._
import java.util.{Date, Locale}

object FrenchDate {
  def main(args: Array[String]) {
    timer(frenchDate)
  }

  def frenchDate() {
    val now = new Date
    val df = getDateInstance(LONG, Locale.FRANCE)
    println(df format now)
  }

  def timer(callback: () => Unit) {
    while(true) {callback(); Thread sleep 1000}
  }
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是日期frenchDate()在第二次打印出来,而在第一次回调中返回并打印.

Jon*_*eet 6

区别在于这一行:

timer(println(frenchDate))
Run Code Online (Sandbox Code Playgroud)

试图调用println(frenchDate)并使用返回值(即Unit)作为要传递的回调timer.你可能想要:

timer(() => println(frenchDate))
Run Code Online (Sandbox Code Playgroud)

或者可能

timer(() => { println(frenchDate) })
Run Code Online (Sandbox Code Playgroud)

(我不是Scala开发人员,所以我不确定正确的语法,但我对你当前代码中的错误很有信心:)

编辑:根据评论,这也应该工作,可能更惯用:

timer { () => println(frenchDate) }
Run Code Online (Sandbox Code Playgroud)