2014-12-03 21 views
0

代碼片段來自Scala REPL。錯誤:類型不匹配;發現:Unit.type required:單元

這是完全合法的斯卡拉,即使它是不是非常有用:

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

爲什麼會出現類型不匹配以及如何修復?

回答

3

內選擇函數使用可變數組緩衝區,並將它作爲一個結果,但你需要單位,你可以這樣來做:

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

或使用追加其返回類型爲單位

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

因此,當我試圖將Unit指定爲函數的最後一行時,它看起來像是在正確的軌道上。 'Unit'和'()'有什麼區別? – axiopisty 2014-12-03 04:05:43

+0

這基本上是一樣的,新單元==()==「java void」 – 2014-12-03 04:07:22

+0

基本上,但不是真的。 '()'編譯,而'Unit'不編譯。我想我可以爲此提出另一個問題。 – axiopisty 2014-12-03 04:08:24