【问题标题】:In Scala, is it possible to use implicits to automatically override toString?在 Scala 中,是否可以使用隐式来自动覆盖 toString?
【发布时间】:2011-08-04 10:40:21
【问题描述】:

在 Java 中,我会做类似的事情

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

MyDate date = new MyDate

有点笨拙。在 Scala 中,是否可以在仍然使用常规 java.util.Date 而不是 MyDate 的同时覆盖 toString。我有一个隐含的暗示,但很乐意使用任何技术

【问题讨论】:

  • 如果你想让不知道你的代码使用正确的toString,你必须扩展java.util.Date;在该对象的方法表中拥有不同的指针是生成不同字符串的唯一方法!

标签: scala


【解决方案1】:

只有在被转换的类型还没有具有给定签名的方法时,隐式转换才能工作。因为所有东西都有toString,所以不可能通过拉皮条来覆盖它。

您可能会使用如下所示的类型类(类似于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 }
}

附注我不建议使用scalaz.Show 的原因是返回类型是List[Char],这对于大多数用途来说是不切实际的

【讨论】:

猜你喜欢
  • 2014-12-20
  • 2012-05-04
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多