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)