为什么scala match.error抛出?

时间:2016-08-09 16:20:35

标签: scala pattern-matching

我试图通过编写一个简单的例子来理解模式匹配。这是:

def main(args: Array[String]) = {
  val tsm = new Test[Number]
    tsm.foo(tsm.Val(10))
}

class Test[T <: Any] {
  def foo(t: Any): Unit = {
    val f: PartialFunction[Any, Unit] = (_: Any) match {
      case Val(s) => println("Val" + s)
      case Sup(l) => println("Sup" + l)
    }
    f()
  }

  class Val(val t: T)
  class Sup(val l: Number)

  object Val{
    def apply(t: T): Val = new Val(t)
    def unapply(arg: Val): Option[T] = Some(arg.t)
  }
  object Sup{
    def unapply(arg: Sup): Option[Number] = Some(arg.l)
  }
}

但代码抛出:

Exception in thread "main" scala.MatchError: () (of class scala.runtime.BoxedUnit)
    at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:253)
    at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:251)
    at com.test.Test$$anonfun$1.applyOrElse(Test.scala:7)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
    at com.test.Test.foo(Test.scala:11)
    at com.test.App$.main(App.scala:6)
    at com.test.App.main(App.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

我不太明白。我创建了一个Val(10)类型的对象,并将其传递给foo。我希望它打印Val10

2 个答案:

答案 0 :(得分:2)

当你调用f()(foo的最后一行)时,你还没有通过t,所以它认为你传递了()。你的意思是f(t)吗?

顺便说一句[T&lt;:Any]是多余的。你可以说[T]。

答案 1 :(得分:2)

定义一个函数f: PartialFunction[Any, Unit],它接受​​Any类型的参数,然后在没有参数的情况下调用它f()。如果您将f()替换为f(t)(这是我认为您的意图),一切正常。