20

私がこれを持っているとしましょう:

class String2(val x:String) {
    def *(times:Int) : String = {
        val builder = new StringBuilder()
        for( i <- 0 until times) {
            builder.append(x)
        }
        builder.toString()
    }
}

これを暗黙的に追加すると、次のようになります。

implicit def gimmeString2(y:String) = new String2(y)

stringWrapper もこれを暗黙的に追加するため、コンパイル エラーが発生します。String2オブジェクトをインスタンス化してそれに取り組む必要がないように、コンパイラに「他の暗黙を無視して、これを使用してください」と言う方法はありますか?

サンプルコードが(この質問に対して)最も適切ではないかもしれないことは認めますが、そうすると思います。

4

1 に答える 1

34

Scala 2.8は、暗黙の優先順位付けシステムを追加しました。このSIPでは、新しいJavaアレイについて説明されています。

オーバーロードされたメソッドまたは暗黙のメソッドの2つの異なる適用可能な選択肢を比較すると、各メソッドは、より具体的な引数を持つための1つのポイントと、適切なサブクラスで定義されるための別のポイントを取得します。これらの2つの比較でより多くのポイントを獲得した場合、代替案は別の代替案に「勝ち」ます

選択肢が同一の引数タイプを持っている場合、サブクラスで定義されているものが勝つと結論付けます。したがって、次のように暗黙を宣言できると思います。

trait LowPriorityImplicits {
  //lower priority conversions
}

object HighPriorityImplicits extends LowPriorityImplicits {
  //higher-order ones here
}
于 2009-12-11T12:12:22.647 に答える