使用隐式类重写方法

Han*_*xue 8 scala type-conversion

我的目的是改变==方法的行为String来调用equalsIgnoreCase.

这段代码

implicit class LowerCase(s: String) {
      override def ==(that: LowerCase) = that.equalsIgnoreCase(this)
}
Run Code Online (Sandbox Code Playgroud)

导致此错误

error: type mismatch;
 found   : MyClass.LowerCase
 required: String
      override def ==(that: String) = that.equalsIgnoreCase(this)
Run Code Online (Sandbox Code Playgroud)

sen*_*nia 14

如果类scala编译器中已有这样的方法,则不会搜索隐式转换.

请注意,您的实现无效,应该是:

implicit class LowerCase(val s: String) {
      def ==(that: LowerCase) = that.s.equalsIgnoreCase(this.s)
}
Run Code Online (Sandbox Code Playgroud)

请注意,它仍然无用.

如果你想用它作为Map密钥,你应该手动指定类型:

implicit class LowerCase(val s: String) {
      // Use `equals`, not `==`
      override def equals(that: Any) = that match {
        case t: LowerCase => t.s.equalsIgnoreCase(this.s)
        case _ => false
      }

  override def toString() = s
}

scala> Set[LowerCase]("A", "a", "b")
res0: scala.collection.immutable.Set[LowerCase] = Set(A, b)
Run Code Online (Sandbox Code Playgroud)

如果要将此方法用于此类变量"a" == "A",则应使用其他方法名称:

implicit class LowerCase(val s: String) extends AnyVal {
      def ===(that: String) = s.equalsIgnoreCase(that)
}

scala> "a" === "A"
res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)