2013-12-20 8 views
7

String==メソッドの動作をequalsIgnoreCaseに変更することを意図しています。このエラーで暗黙のクラスを使用したメソッドのオーバーライド

このコード

implicit class LowerCase(s: String) { 
     override def ==(that: LowerCase) = that.equalsIgnoreCase(this) 
} 

結果場合

error: type mismatch; 
found : MyClass.LowerCase 
required: String 
     override def ==(that: String) = that.equalsIgnoreCase(this) 
+0

「動作しない」とはどういう意味ですか?エラーが出ますか?それはあなたが期待しているものとは異なって振る舞いますか?あなたは何を期待していましたか、それは実際に何をしていますか、それはあなたが期待したものとどのように違うのですか? – Jesper

+0

はい、コンパイラエラーメッセージが追加されました – hanxue

答えて

12

クラスScalaのコンパイラでこのような方法は、暗黙的な変換を検索しない既に存在します。あなたの実装が無効であることを

注意、それは次のようになります。

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

注それはまだ役に立たないということ。

あなたが手動タイプを指定する必要があり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) 

あなたはこの"a" == "A"ような変数で、このメソッドを使用する場合は、別のメソッド名を使用する必要があります

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

scala> "a" === "A" 
res0: Boolean = true 
+1

クラスメソッドを暗黙的にオーバーライドする方法がありますか?つまり、スーパークラスのメソッドを拡張して手動でオーバーライドしないでください。 – hanxue

+0

まだエラーがあります: 'override'を削除し、コンストラクタパラメータは' val'である必要があります。しかし、あなたが言及したことのためにさえ、うまくいきません(Scalaは暗黙の変換を検索する理由がありません)。 – Jesper

+0

@Jesper:ありがとう、固定。 – senia

関連する問題