【发布时间】: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