4

我想我错过了一些东西:

scala> Some(1) collect ({ case n if n > 0 => n + 1; case _ => 0})
res0: Option[Int] = Some(2)

scala> None collect ({ case n if n > 0 => n + 1; case _ => 0})   
<console>:6: error: value > is not a member of Nothing
       None collect ({ case n if n > 0 => n + 1; case _ => 0})
                                 ^
<console>:6: error: value + is not a member of Nothing
       None collect ({ case n if n > 0 => n + 1; case _ => 0})

为什么会发生此错误?我想我误解了它collect的工作原理......

4

2 回答 2

14

除非您指定,否则文字None的类型为Option[Nothing]。这是必要的,因为 None 必须是所有类型 Option[_] 的有效成员。如果你改为写

(None:Option[Int]) collect ({ case n if n > 0 => n + 1; case _ => 0}) 

或者

val x:Option[Int] = None
x collect ({ case n if n > 0 => n + 1; case _ => 0}) 

然后编译器将能够键入检查您的对方付费电话

于 2011-03-03T18:20:22.030 回答
1
None collect ({ case n if n > 0 => n + 1; case _ => 0}) 

为什么n会有方法>?那里没有任何东西可以让编译器假设这一点。因此,尝试将其更改为:

None collect ({ case n: Int if n > 0 => n + 1; case _ => 0})

您将收到以下错误消息:

<console>:8: error: pattern type is incompatible with expected type;
 found   : Int
 required: Nothing
       None collect ({ case n: Int if n > 0 => n + 1; case _ => 0}) 
                               ^

基本上,这意味着编译器知道 anInt在这里是不可能的,因为您只是通过None. 碰巧,None是类型Option[Nothing]

于 2011-03-03T18:54:12.053 回答