私は Scala が初めてで、現在 Scala の型パラメーターについて学んでおり、次のシナリオに遭遇しました。
と の2 つのクラスがあるA
とします。B
ここで、B
は のサブタイプですA
。
class A {
...
}
class B extends A {
...
}
だから私は言うことができますB <: A
。
これも意味があるのList[B] <: List[A]
?
List の場合、List の型パラメーターは共変であるため、B <: A
実際には を意味します。List[B] <: List[A]
型パラメーターを共変にするということは、それが List の定義で共変の位置にのみ表示されることを意味します。つまり、パラメーターの型としてではなく、メソッドの戻り値の型としてのみ表示されます。「Scala のツアー」には、varianceに関するセクションが含まれています。ウィキペディアにも分散に関する優れた記事があります。型パラメーターの分散の 3 つのオプションは次のとおりです。
C[A]
のサブタイプではありません。この例は、配列などの変更可能なデータ構造です。C[B]
A
B
B <: A
意味しC[B] <: C[A]
ます。例としては、不変のデータ構造や関数の戻り値の型があります。A <: B
意味しC[B] <: C[A]
ます。たとえば、関数はパラメーターの型において反変です。