0
  trait B {
    type MyInnerType
    def foo: MyInnerType
  }      
  object B1 extends B {
    type MyInnerType = Double
    val foo = 3.0
  }

  trait A {
    type MyInnerType
    val b: B
    def foo(x: b.MyInnerType): MyInnerType
    def bar(y: MyInnerType): Unit
  }
  object A1 extends A {
    type MyInnerType = Int
    val b = B1
    def foo(x: b.MyInnerType) = 1
    def bar(y: MyInnerType) {}
  }
  object A2 extends A {
    type MyInnerType = String
    val b = B1
    def foo(x: b.MyInnerType) = "a"
    def bar(y: MyInnerType) {}
  }

  val as = Seq(A1, A2)
  as foreach { a => a.bar(a.foo(a.b.foo)) }   // wrong, a.foo(a.b.foo) infers to Any

ただし、a.fooパラメータを受け取らない場合は、すべてが完全に機能し、をa.foo推測しa.MyInnerTypeます。キャストしても動作し.asInstanceOf[a.MyInnerType]ます。説明はありますか?

4

1 に答える 1

1

私はscala 2.9.1を実行しており、REPLでこれを取得しますas:

scala> val as = Seq(A1, A2)
as: Seq[ScalaObject with A{def foo(x: Double): Any; val b: B1.type; type MyInnerType >: java.lang.String with Int}] = List(A1$@6da13047, A2$@7168bd8b)

ただし、次のように変更すると、次のようval as:Seq[A] = Seq(A1, A2)になります。

scala> val as:Seq[A] = Seq(A1, A2)
as: Seq[A] = List(A1$@6da13047, A2$@7168bd8b)

scala> as foreach { a => a.bar(a.foo(a.b.foo)) }

時々 (常に) scala は型を推測するのに問題があるので、必要なものに注釈を付ける必要があります。私はよく REPL に行き、実際に何が起こっているのかを調べます。

于 2013-01-04T22:25:31.240 に答える