为什么会抛出scala match.error?

为什么会抛出scala match.error?,scala,pattern-matching,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) =>

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

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)
  }
}
我不太明白。我创建了一个
Val(10)
类型的对象,并将其传递给
foo
。当你调用f()(foo的最后一行)你还没有通过t,所以它认为你通过了()。你是说f(t)吗

顺便问一下,当你调用f()(foo的最后一行)时,你没有通过T,所以它认为你通过了()。你是指f(T)吗


顺便说一句,[T你定义了一个函数
f:PartialFunction[Any,Unit]
,它接受一个
Any
类型的参数,然后不带参数地调用它
f()
。如果你用
f(T)
替换
f(T)
(我认为这是你想要的),一切都能正常工作。

你定义了一个函数
f:PartialFunction[Any,Unit]
接受类型为
Any
的参数,然后将其称为
f()
,不带参数。如果将
f()
替换为
f(t)
(我认为这是您想要的)一切正常。

@user3663882如果您使用
-deprecation
运行
scalac
,您至少会得到一个很好的警告:警告:
通过插入()调整参数列表已被弃用:这不太可能是您想要的。签名:Function1.apply(v1:T1):R给定参数:自适应后:Function1(():Unit)f()
@user3663882如果使用
-deprecation
运行
scalac
,至少会得到一个很好的警告:警告:
通过插入()已弃用:这不太可能是您想要的。签名:Function1.apply(v1:T1):R给定参数:自适应后:Function1(():Unit)f()
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)