2013-05-02 11 views
5

次の暗黙の方法が適用されないのはなぜですか?また、XのインスタンスをYのインスタンスに自動的に変換し、暗黙的にConversion[X,Y]というスコープを持つようにするにはどうすればよいですか。暗黙の変換が機能しない

trait Conversion[X, Y] { 
    def apply(x: X): Y 
} 
implicit object Str2IntConversion extends Conversion[String, Int] { 
    def apply(s: String): Int = s.size 
} 
implicit def convert[X, Y](x: X)(implicit c: Conversion[X, Y]): Y = c(x) 

val s = "Hello" 
val i1: Int = convert(s) 
val i2: Int = s // type mismatch; found: String required: Int 
+1

最後の行が動作するために、あなたはSTRING'に 'Int''からの暗黙的な変換を必要とします、例えば'暗黙的に[String => Int] ' - 存在しない。ここで問題となるのは、 'Y'がパラメータであり、Scalaはあなたが探している型に代わるものではありません。たとえば、暗黙的なdef convert [X](x:X)(暗黙のc:Conversion [X、Int]):Int = c(x) 'は動作します。 –

答えて

4

あなたの変換は、あなたはもうヘルパーメソッドは必要ありません、Function1を拡張してください:

trait Conversion[X, Y] extends (X => Y) { 
    def apply(x: X): Y 
} 

// unchanged 
implicit object Str2IntConversion extends Conversion[String, Int] { 
    def apply(s: String): Int = s.size 
} 

// removed convert 

// unchanged 
val s = "Hello" 
val i1: Int = convert(s) 
val i2: Int = s 
+1

いいアイデア!ありがとうございました。しかし、最初の質問が残っています:なぜ私のコードが機能していないのですか? –

+0

@PeterSchmitzおそらく、暗黙的に応じて一般的な戻り値の型があるからです。 'Y'を' Int'に置き換えると、コードが動作します。 – gzm0

関連する問題