5

このページhttp://www.scala-lang.org/node/137を読んでいますが、共分散とは何か、下限も理解していますが、明確ではないのは次の行です。

残念ながら、このプログラムはコンパイルされません。共分散アノテーションは、型変数が共分散位置でのみ使用されている場合にのみ可能であるためです。型変数Tはメソッドprependのパラメーター型として表示されるため、このルールは破られます。

なぜelemスーパータイプのインスタンスである必要があるのか​​、すでに共変Tである場合は、なぜ現在のリストの前に追加できないのか。ListNodeelem

4

1 に答える 1

2
class Super             {override def toString = "Super"}
class Sub extends Super {override def toString = "Sub"; def subMethod {} }
val sup = new Super
val sub = new Sub

以下が許可されていると想像してください。

// invalid code
class Foo[+T] {
  def bar(x: T) = println(x)
}

Fooは で共変であるためT、これは有効です (aFoo[Sub]はであるため、単純なアップキャストFoo[Super]):

val foo : Foo[Super] = new Foo[Sub] {
  override def bar(x: Sub) = x.subMethod
}

現在foo、私たちが知る限り、 はFoo[Super]他のものと同じですが、実装には次のものが必要なbarため、そのメソッドは機能しません。barSub

foo.bar(sup) // would cause error!
于 2012-05-12T15:07:26.890 に答える