перегрузка неприменить метод в случае классов: Scala - PullRequest
6 голосов
/ 25 октября 2011

Рассмотрим следующий фрагмент кода:

case class User(id: Int, name: String)
object User{
  def unapply(str: String) = Some(User(0, str))
}

Scala жалуется: «ошибка: не удается разрешить перегрузку неприменимым; класс дела User (id: Int, str: String)» Не возможно перегрузить неприменить?

обновление: не применять с большим размером кортежа.

case class User(id: Int, str: String)
object User{
  def unapply(s: String) = Some((User(0, s), s, 1234))
}

Компилятор по-прежнему жалуется, что "не удается разрешить перегрузку неприменить"

Ответы [ 2 ]

8 голосов
/ 25 октября 2011

Ваш метод неприменения не может быть использован при сопоставлении с образцом

Он работает с

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)

Полагаю, вам нужен первый.В этом случае как ваш, так и стандартный применяются два метода с одним и тем же списком аргументов (один параметр пользователя), поэтому они не совместимы.Это может показаться немного прискорбным, поскольку, когда методы вызываются как экстракторы, отличительным элементом на самом деле является размер кортежа результата, а не тип аргументов.

Однако ваш метод, хотя и недопустим в качестве экстрактора, не вызывает конфликтов.Я не мог найти что-то в спецификации, что запретило бы это.Тем не менее, это бесполезно, и полезный метод по праву не будет разрешен.

2 голосов
/ 24 августа 2015

Причина, по которой вы не можете переопределить неприменимое (особенно), скорее всего, состоит в том, что он имеет ту же сигнатуру, что и та, которая автоматически создается объектом-компаньоном класса наблюдения. Помня, что сигнатура функции не учитывает ее возвращаемое значение в качестве цели переопределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...