您的 unapply 方法无法用于模式匹配
它适用于
def unapply(arg: <type to match>) : Option[(<matched fields types>)]
(如果只有一个字段,则没有元组;如果没有字段,则使用布尔值而不是选项)。
User 的标准 unapply 是(Scala 语言规范第 67 页)
def unapply(u: User) =
if (u eq null) None
else Some((u.id, u.name))
你想要的是匹配一个 id 为零的用户,如下所示
user match {case User(name) => ....}
那将是
def unapply(u: User): Option[String] =
if(u eq null || u.id != 0) None
else Some(u.name)
如果您希望字符串可以作为用户进行匹配(这会很奇怪)
def unapply(s: String): Option[User] = Some(User(0, s))
它将与
"john" match case User(u) => ... // u is User(0, john)
我猜你想要前一种。在这种情况下,您的 apply 和标准方法都是具有相同参数列表(一个 User 参数)的两种方法,因此它们不兼容。这可能被认为有点不幸,因为当方法被调用为提取器时,区别元素实际上是结果元组的大小,而不是参数的类型。
然而,您的方法虽然作为提取器无效,但不会引起冲突。我在规范中找不到禁止它的内容。尽管如此,它还是没用,而且有用的方法也不会被允许。