0

これは、暗黙的型とパス依存型のもう1つです。ここでなぜそれほど冗長にする必要があるのか​​わかりません:(注-答えを見つけました。以下を参照してください)

trait B
trait C[X]
trait A { def call[B1 <: B](implicit b: B1): C[B1] }
trait D extends B {
  def set(c: C[this.type]): Unit
}

初挑戦:

def test1(a: A)(implicit d: D: Unit =
  d.set(a.call) // found C[D] -- required C[d.type]

2回目の試行:

def test2(a: A)(implicit d: D): Unit =
  d.set(a.call[d.type]) // could not find implicit value for parameter b: d.type

3回目の試行:

def test3(a: A)(implicit d: D): Unit =
  d.set(a.call[d.type](d))  // works. why so much clutter!?
4

2 に答える 2

1

Scala 2.9 REPLは私たちを助けてくれます(この有用なメッセージを追加してくれた人に感謝します!)。ここでtest1

 found   : C[D]
 required: C[d.type]
Note: D >: d.type, but trait C is invariant in type X.
You may wish to define X as -X instead. (SLS 4.5)
              d.set( a.call ) // found C[D] -- required C[d.type]
                       ^

したがって、に変更trait C[ X ]するとtrait C[ -X ]test1期待どおりに機能します。

于 2011-04-05T02:26:13.760 に答える
1

よろしいですthis.typeか?Scalaの「このタイプ」は、より一般的に「 MyType 」として知られているものと同じではありません。に関するこのディスカッションthis.type、およびMyTypeの質問によってリンクされたディスカッションを参照してください。

于 2011-04-05T14:17:42.233 に答える