В Scala возможно ли использовать имплициты для автоматического переопределения toString? - PullRequest
8 голосов
/ 04 августа 2011

В Java я бы сделал что-то вроде

class MyDate extends java.util.Date {
  public String toString() { ... }
}

MyDate date = new MyDate

Немного неуклюже.В Scala можно переопределить toString, хотя вместо MyDate все еще используется обычный java.util.Date.У меня есть подозрения, вовлеченные, но я был бы рад использовать любую технику

1 Ответ

17 голосов
/ 04 августа 2011

Неявные преобразования могут работать, только если у преобразованного типа еще нет метода с данной сигнатурой. Поскольку у всего есть toString, это невозможно переопределить с помощью pimping.

Что вы можете сделать, это использовать класс типов (сродни scalaz.Show), который выглядит следующим образом:

trait Show[-A] {
  def show(a : A): String
}

Тогда вы можете использовать show везде вместо toString. В идеале вы должны сделать экземпляр Show[Any] неявным с очень низким приоритетом.

implicit val DateShow = new Show[Date] { def show(d : Date) = "whatever" }

trait LowPriorityShows {
  implicit val AnyShow = new Show[Any] { def show(a : Any) = a.toString }
}

P.S. Причина, по которой я бы не предложил использовать scalaz.Show, заключается в том, что тип возвращаемого значения List[Char], что просто невозможно для большинства случаев использования

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