我试图通过编写一个简单的例子来理解模式匹配。这是:
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
。
答案 0 :(得分:2)
当你调用f()(foo的最后一行)时,你还没有通过t,所以它认为你传递了()。你的意思是f(t)吗?
顺便说一句[T&lt;:Any]是多余的。你可以说[T]。
答案 1 :(得分:2)
定义一个函数f: PartialFunction[Any, Unit]
,它接受Any
类型的参数,然后在没有参数的情况下调用它f()
。如果您将f()
替换为f(t)
(这是我认为您的意图),一切正常。