質問
の違いは何ですか
[A <: B]
と
[+B]
スカラで?
解決
Q[A <: B]
そのクラスを意味します Q
クラスを受講できます A
それはのサブクラスです B
.
Q[+B]
という意味です Q
取っていいよ どれか クラスですが、if A
のサブクラスです B
, 、 それから Q[A]
のサブクラスと考えられています Q[B]
.
Q[+A <: B]
そのクラスを意味します Q
のサブクラスのみを取ることができます B
サブクラス関係の伝播と同様に。
1つ目は、一般的なことをしたいときに役立ちますが、特定の一連のメソッドに頼る必要があります B
. 。たとえば、あなたが持っている場合 Output
とのクラス toFile
方法、そのメソッドをに渡すことができるクラスで使用できます Q
.
2つ目は、元のクラスと同じように振る舞うコレクションを作成したい場合に役立ちます。あなたが取るなら B
そして、あなたはサブクラスを作ります A
, 、それからあなたは合格することができます A
どこでも B
期待されています。しかし、あなたが取る場合 コレクション の B
, Q[B]
, 、いつでも渡すことができるのは本当ですか Q[A]
代わりは?一般的に、いいえ。これが間違ったことになる場合があります。しかし、あなたはこれが使用することによって正しいことだと言うことができます +B
(共分散; Q
同僚 - フォローと一緒に -B
「サブクラス」相続関係)。
他のヒント
拡張したいです レックスカーの優れた答え さらにいくつかの例があります:4つのクラスがあるとしましょう。
class Animal {}
class Dog extends Animal {}
class Car {}
class SportsCar extends Car {}
分散から始めましょう:
case class List[+B](elements: B*) {} // simplification; covariance like in original List
val animals: List[Animal] = List( new Dog(), new Animal() )
val cars: List[Car] = List ( new Car(), new SportsCar() )
ご覧のように リストは、動物と車が含まれているかどうかは気にしません. 。リストの開発者は、たとえば、車のみがリスト内に入ることができることを強制しませんでした。
さらに:
case class Shelter(animals: List[Animal]) {}
val animalShelter: Shelter = Shelter( List(new Animal()): List[Animal] )
val dogShelter: Shelter = Shelter( List(new Dog()): List[Dog] )
関数がaを期待する場合 List[Animal]
パラメーターaを渡すこともできます List[Dog]
代わりに関数への議論として。 List[Dog]
のサブクラスと見なされます List[Animal]
リストの共分散のため。リストが不変であっても機能しません。
次にタイプの境界に:
case class Barn[A <: Animal](animals: A*) {}
val animalBarn: Barn[Animal] = Barn( new Dog(), new Animal() )
val carBarn = Barn( new SportsCar() )
/*
error: inferred type arguments [SportsCar] do not conform to method apply's type parameter bounds [A <: Animal]
val carBarn = Barn(new SportsCar())
^
*/
ご覧のように 納屋は、動物を対象としたコレクションです. 。ここには車が許可されていません。
私の理解のために:
1つ目はパラメータータイプバインドで、上下のタイプバウンドがあり、この場合は「b(またはb自体)のサブタイプであるタイプパラメーターaがあります。
2つ目は、クラスの定義の分散アノテーションです。私たちの場合、Bの共分散サブクラス化
Scala: + Java:? t共変量サブクラス化を拡張します
Scala:-Java:?スーパーTコントラリアントサブクラス化
この質問を調査しながら、このブログ投稿を見つけました。カテゴリ理論におけるその理論的根拠を含む、SCALA分散のさらに深い説明を提供します
http://blogs.atlassian.com/2013/01/covariance-and-contravariance-in-scala/