【问题标题】:override equals method for string class in a package in a scala project覆盖scala项目中包中字符串类的equals方法
【发布时间】:2019-05-27 08:09:08
【问题描述】:

所以问题陈述正如它所说的那样。我想覆盖特定包中字符串类中equals的行为。

我环顾四周,大多数情况下似乎没有办法做到这一点。

我最接近在现有类上定义方法的是 -

implicit class StringImprovements(s: String) {
  def increment = s.map(c => (c + 1).toChar)
}

然后像这样使用它 -

"HAL".increment

说实话,这真是太神奇了。但是后来我尝试使用相同的方法覆盖等于,它不起作用。 我环顾四周,发现了 2015 年的这个问题 - override library method using Scala Implicit

引用上述问题中的一句话 -

如果 scala 编译器找不到没有它的方法,则使用隐式,所以你不能用隐式覆盖方法

但鉴于 scala 发布非常频繁,而且事情一直在变化,我想知道现在是否可以通过这种方式或任何其他方式这样做。

提前致谢!

【问题讨论】:

  • 即使有可能,您也只能为您自己的代码覆盖 String#equals(因为它必须使用您的隐式代码)。已经针对“正常”字符串编译的任何其他内容都不会受到影响,并且结果将非常混乱,尤其是对于这样的核心方法。
  • @Thilo 看来我不应该在我的项目中使用“无处不在”这个词。它具有误导性,很抱歉造成混淆,我已将其编辑为“特定包”。所以基本上是“我所有的代码”
  • 好吧,你不能这样做。您必须选择不同的方法名称或将字符串框入您自己的类型MySpecialString,然后您可以根据自己的喜好定义equals(和hashCode)。

标签: scala overriding implicit


【解决方案1】:

不,这是不可能的。如果是这样,我希望很多库代码会中断,因为它预期来自String#equals 的正常行为!

【讨论】:

  • 我不是在谈论 String equals 的行为随处变化,只是在我指定的包范围内,我必须专门导入特定的隐式类。所以库代码永远不会中断。对?如果我错了,请纠正我
  • 看来我不应该在我的项目中使用“无处不在”这个词。它具有误导性,很抱歉造成混淆,我已将其编辑为“特定包”。所以基本上是“我所有的代码”
  • 这仍然很奇怪。当您使用字符串作为映射键或集合成员时,您希望它使用您的相等还是标准的?如果地图是从库方法返回的呢?正如 Thilo 的评论所说,定义您的单独类型(并可能添加与String 和/或来自String 的隐式转换)更有意义。
猜你喜欢
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
相关资源
最近更新 更多