Scala List.collect上的匹配错误

Scala List.collect上的匹配错误,scala,Scala,第二个实现有什么问题 有效: scala> List(1,2,3).collect{ case i: Int if i % 2 == 0 => i } res1: List[Int] = List(2) scala> val evens = PartialFunction[Any, Int]{ | case i: Int if i % 2 == 0 => i | } evens: PartialFunction[Any,Int] = <func

第二个实现有什么问题

有效:

scala> List(1,2,3).collect{ case i: Int if i % 2 == 0 => i }
res1: List[Int] = List(2)
scala> val evens = PartialFunction[Any, Int]{
     | case i: Int if i % 2 == 0 => i
     | }
evens: PartialFunction[Any,Int] = <function1>

scala> List(1,2,3).collect{evens}
scala.MatchError: 1 (of class java.lang.Integer)
    at $anonfun$1.apply(<console>:7)
    at $anonfun$1.apply(<console>:7)
    at scala.PartialFunction$$anonfun$apply$1.applyOrElse(PartialFunction.scala:242)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
    at scala.collection.TraversableLike$$anonfun$collect$1.apply(TraversableLike.scala:278)
    at scala.collection.immutable.List.foreach(List.scala:318)
    ...
没有:

scala> List(1,2,3).collect{ case i: Int if i % 2 == 0 => i }
res1: List[Int] = List(2)
scala> val evens = PartialFunction[Any, Int]{
     | case i: Int if i % 2 == 0 => i
     | }
evens: PartialFunction[Any,Int] = <function1>

scala> List(1,2,3).collect{evens}
scala.MatchError: 1 (of class java.lang.Integer)
    at $anonfun$1.apply(<console>:7)
    at $anonfun$1.apply(<console>:7)
    at scala.PartialFunction$$anonfun$apply$1.applyOrElse(PartialFunction.scala:242)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
    at scala.collection.TraversableLike$$anonfun$collect$1.apply(TraversableLike.scala:278)
    at scala.collection.immutable.List.foreach(List.scala:318)
    ...
scala>val evens=PartialFunction[Any,Int]{
|案例一:如果i%2==0=>i,则为Int
| }
evens:PartialFunction[Any,Int]=
scala>List(1,2,3).collect{evens}
scala.MatchError:1(属于类java.lang.Integer)
在$anonfun$1.应用(:7)
在$anonfun$1.应用(:7)
在scala.PartialFunction$$anonfun$apply$1.applyOrElse处(PartialFunction.scala:242)
在scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)中
在scala.collection.TraversableLike$$anonfun$collect$1.apply(TraversableLike.scala:278)
位于scala.collection.immutable.List.foreach(List.scala:318)
...

您的代码实际上在Scala 2.9.2(模不正确的部分函数声明)上工作。但是,在任何情况下,原因可能是类型签名:

PartialFunction[Any, Int]
因为第一个类型参数是
Any
,所以集合元素会自动装箱到
java.lang.Integer
实例中——它甚至在堆栈跟踪中这样说(因为
Any
对应于
对象
)。但是,您正在匹配
Int
,这会导致错误

使用
PartialFunction[Int,Int]
可以解决问题,即:

val evens:PartialFunction[Int, Int] = {case i: Int if i % 2 == 0 => i}

您应该像这样创建
evens
PartialFunction

val evens: PartialFunction[Any, Int] = {
  case i: Int if i % 2 == 0 => i
}
def apply[A, B](f: (A) ⇒ B): PartialFunction[A, B]
使用
PartialFunction[Any,Int]{…}
调用对象
PartialFunction
apply
方法。它的定义如下:

val evens: PartialFunction[Any, Int] = {
  case i: Int if i % 2 == 0 => i
}
def apply[A, B](f: (A) ⇒ B): PartialFunction[A, B]
因此,
{case i:Int if i%2==0=>i}
用作函数,而不是
PartialFunction
evens
在任何参数处定义:

scala> val evens = PartialFunction[Any, Int]{
     |   case i: Int if i % 2 == 0 => i
     | }

scala> evens.isDefinedAt(1)
res1: Boolean = true

scala> val evens: PartialFunction[Any, Int] = {
     |   case i: Int if i % 2 == 0 => i
     | }

scala> evens.isDefinedAt(1)
res5: Boolean = false