2

これは、私の以前の投稿のあいまいな暗黙の変換エラーのはるかに単純なバージョンです。

これは、投稿からのコード スニペットです。Scala で暗黙をチェーンするにはどうすればよいですか?

class A(val n: Int)
class B(val m: Int, val n: Int)
class C(val m: Int, val n: Int, val o: Int) {
  def total = m + n + o
}

object T2 {
  implicit def toA(n: Int): A = new A(n)
  implicit def aToB[A1 <% A](a: A1): B = new B(a.n, a.n)
  implicit def bToC[B1 <% B](b: B1): C = new C(b.m, b.n, b.m + b.n)

  // works
  println(5.total)
  println(new A(5).total)
  println(new B(5, 5).total)
  println(new C(5, 5, 10).total)
}

D次のようにクラスと暗黙的な定義を追加するとdToC、スニペットに示されている場所でエラーが発生します。

class A(val n: Int)
class B(val m: Int, val n: Int)
class D(val m: Int, val n: Int) //Added by me
class C(val m: Int, val n: Int, val o: Int) {
    def total = m + n + o
}

object T2 {
  implicit def toA(n: Int): A = new A(n)
  implicit def aToB[A1 <% A](a: A1): B = new B(a.n, a.n)
  implicit def bToC[B1 <% B](b: B1): C = new C(b.m, b.n, b.m + b.n)
  implicit def dToC[D1 <% D](d: D1): C = new C(d.m, d.n, d.m + d.n)  //Added by me

  println(5.total) //Ambiguous implicit conversion error
  println(new A(5).total) //Ambiguous implicit conversion error
  println(new B(5, 5).total) //Ambiguous implicit conversion error
  println(new C(5, 5, 10).total) 
}

bToCとの両方dToCが say の可能な変換関数である方法がわかりませんprintln(new B(5, 5).total)

4

2 に答える 2

1

ビューの境界は明らかに、追加の暗黙的な関数パラメーターに変換されます。したがって、bToCdToCget の両方に翻訳されます[T](x: T)(implicit f: T => Something): C

問題は、コンパイラがあいまいさチェックで暗黙の引数の有無を無視することです。

case class Foo[A](value: A)
implicit def foo[A](x: A)(implicit ev: Any =:= String) = Foo(x)
implicit def bar[A](x: A)(implicit ev: Any =:= Int) = Foo(x)
1.value //Ambiguous though none are applicable
于 2012-07-30T14:00:29.983 に答える
-1

(1)Int => A => B => C

(2)Int => A => D => C

2つのパスを選択できますが、コンパイラはどちらのパスを選択するかわからないため、あいまいな暗黙の変換エラーが発生しました。

于 2012-07-30T08:39:20.497 に答える