Ваш метод неприменения не может быть использован при сопоставлении с образцом
Он работает с
def unapply(arg: <type to match>) : Option[(<matched fields types>)]
(без кортежа, если только одно поле, вместо логического значения вместо Option, если поля нет).
Стандартное неприменение пользователя будет (Спецификация языка Scala, стр. 67)
def unapply(u: User) =
if (u eq null) None
else Some((u.id, u.name))
Это то, что вы хотите, чтобы сопоставить пользователя с нулевым идентификатором, как в
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)
Полагаю, вам нужен первый.В этом случае как ваш, так и стандартный применяются два метода с одним и тем же списком аргументов (один параметр пользователя), поэтому они не совместимы.Это может показаться немного прискорбным, поскольку, когда методы вызываются как экстракторы, отличительным элементом на самом деле является размер кортежа результата, а не тип аргументов.
Однако ваш метод, хотя и недопустим в качестве экстрактора, не вызывает конфликтов.Я не мог найти что-то в спецификации, что запретило бы это.Тем не менее, это бесполезно, и полезный метод по праву не будет разрешен.