错误:类型不匹配;发现:需要Unit.type:单位

时间:2014-12-03 03:43:53

标签: scala

代码段来自Scala REPL。

这是完全合法的Scala,即使它不是很有用:

scala> class Test {
  private val xs = scala.collection.mutable.ArrayBuffer[Int]()
  private val func = Some((x: Int)=>{
  })
  private var opt: Option[(Int)=>Unit] = None
  opt = func
}
defined class Test

但是,如果我尝试在func内部执行某些操作,则代码将无法编译:

scala> class Test {
  private val xs = scala.collection.mutable.ArrayBuffer[Int]()
  private val func = Some((x: Int)=>{
    xs += x
  })
  private var opt: Option[(Int)=>Unit] = None
  opt = func
}
<console>:13: error: type mismatch;
 found   : Some[Int => Test.this.xs.type]
 required: Option[Int => Unit]
         opt = func
               ^

相反,它会产生类型不匹配错误,并列出找到和需要的类型。虽然此错误消息很有用,但我不知道如何解决它。我的下一次尝试是这样的:

scala> class Test {
  private val xs = scala.collection.mutable.ArrayBuffer[Int]()
  private val func = Some((x: Int)=>{
    xs += x
    Unit
  })
  private var opt: Option[(Int)=>Unit] = None
  opt = func
}
<console>:14: error: type mismatch;
 found   : Some[Int => Unit.type]
 required: Option[Int => Unit]
         opt = func
               ^

我知道存在类型不匹配,但我不明白为什么存在类型不匹配或如何以func在{{1}}内做一些有用的方式修复它。

为什么会出现类型不匹配以及如何解决?

1 个答案:

答案 0 :(得分:3)

函数内部选项使用可变数组缓冲区并将其作为结果返回,但是你需要Unit,你可以这样做:

private val func = Some((x: Int)=> {xs += x; ()})

或使用返回类型为Unit的附加

private val func = Some((x: Int) => xs.append(x))