scala - 回调时获取 "error: type mismatch; found : Unit required: () => Unit"

标签 scala types 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}
  }
}

带来错误

error: type mismatch;
found   : Unit
required: () => Unit
println(frenchDate)

虽然下面的工作

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}
  }
}

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

最佳答案

区别在于这一行:

timer(println(frenchDate))

正在尝试调用 println(frenchDate) 并使用返回值(即 Unit)作为回调传递给 timer。你可能想要:

timer(() => println(frenchDate))

或者可能

timer(() => { println(frenchDate) })

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

编辑:根据评论,这也应该有效并且可能更惯用:

timer { () => println(frenchDate) }

关于scala - 回调时获取 "error: type mismatch; found : Unit required: () => Unit",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572166/

相关文章:

java - 如何在 Play Framework 模板中使用我自己的 Iterable

Scala 匿名混入?

object - 返回 interface{} 而不是 int64 时的额外分配

callback - EXTJS 4.0 : how to implement callback method for store. 同步()方法?

ruby - 使用 Ruby/Sinatra 和 JRuby 或 Scala 构建 REST API

scala - 为什么Scala中的Final变量可以更改值

c# - 替代嵌套类型的类型 Expression<Func<T>>

typescript - 如何访问可为空的 typescript 嵌套类型

ruby-on-rails - after_initialize和after_find回调顺序在Active Record对象生命周期中?

android twitter4j 回调调用主要 Activity