[T <:A]:上限Tタイプ、すなわち、T Aは、親クラス・タイプがある上限は、UpperBound
抽象クラス動物{
DEFパラメータname:String
}
抽象クラスペット動物{}延び
クラス猫はペット{延び
:文字列= "CAT"名DEFオーバーライド
}
クラス犬はペット{延び
:文字列= "犬"オーバーライド名DEF
}
クラスライオン動物を拡張{
DEF名を上書き:文字列= "ライオン"
}
クラスUpperBoundDemo2 [P <:ペット](P:P){
DEFペット:P = P
}
オブジェクトUpperBoundDemo2 {
DEFメイン(引数:配列[文字列]):単位= {
ヴァルdogContainer =新しいUpperBoundDemo2 [犬](新しい犬)
ヴァルcatContainer =新しいUpperBoundDemo2 [猫](新しいCAT)
のprintln(dogContainer.pet.name)
//このラインコンパイルエラー、UpperBoundDemo2要求Pは、サブクラスペットでなければならず、ライオン動物から継承ため
ヴァルlionContainer =新しい新しいUpperBoundDemo2 [ライオン](新しい新しいライオン)
}
}
【Bは>:A]下限下界:Bは、クラスAのサブクラスであります
ノード形質[+ B] { ので、ここ//関数は、インバータであるため、共変戻り、着信親U Bに下限を使用する必要があり、インバータを満たす DEFプリペンド[Uを>:B] (ELEM:U-):ノード[U-] } ケースクラスListNode [+ B](H:B、T:ノード[B])ノード[B] {延び プリペンドDEFオーバーライド[U->:B](ELEM:U-)を:ノード[U-] = ListNode(ELEM、この) DEFヘッド:B = H DEFテール:ノード[B] = T } ケースクラス無記号[+ Bが()ノード[B] {延び プリペンドDEFオーバーライド[U-を> B](ELEM:U-):ノード[U-] = ListNode(ELEM、これは) } LowerBoundClassアプリ{拡張するオブジェクト 形質バード ケースクラスAffricanSwallow()はバード延び ケースクラスEuropeanSwallow()延びバード ヴァルaffricanSwallowList = ListNode [AffricanSwallow(AffricanSwallow ()、無記号()) ヴァルbirdList:ノード[鳥] = affricanSwallowList birdList.prepend(新しいEuropeanSwallow) }
[B <%のA] ViewBoundは、タイプBのタイプを変換する必要があり、必要な暗黙の変換関数を表します。
[B:A] ContextBound値の暗黙的な変換が必要
TはAのサブクラスである場合[-A]インバータは、パラメータタイプとして、次いでC [T]はC [A]サブクラスであります
抽象クラスプリンタ[-A] { DEF(値:A):印刷ユニット } クラスAnimalPrinterプリンター[AnimalC] {延び 単位= {:オーバーライドDEFプリント(:AnimalC値) のprintln( "この動物の名前である" +値。名) } } クラスCatPrinterプリンター[CATC] {延び CATC):単位= {(値を出力DEFオーバーライド のprintln( "この猫の名前は" + value.name) } } オブジェクトContravarianceTestは、App {延び :CATC = valのmyCatをCATC( "トム") DEF printMyCat(プリンタ:プリンタ[CATC):単位= { printer.print(myCat) } ヴァルcatPrinter:プリンタ[CATC] =新しいcatPrinter ヴァルanimalPrinter:プリンタ[AnimalC] =新しいAnimalPrinter //プリンタ[AnimalC]できる代わりプリンタ[CATC]ひいてはない printMyCat(catPrinter) printMyCat(animalPrinter) }
[Bの+]共変戻り値の型として、BがTのサブクラスである場合、Cは、[B]はC [T]サブクラス
次の例では、猫、犬は動物のサブクラスは、Scalaの標準ライブラリには、抽象クラスの一覧[+ A]を密封していているので、リスト[猫]、リスト[犬]に置き換えることができます
一覧[動物]サブクラス猫などの位置、犬は動物です
抽象クラスAnimalCは{ DEFパラメータname:String } ケースクラスはCATC(名称:String)をAnimalC延び ケースクラスDogC(名称:String)を延びAnimalCの クラスCovarianceTest { } オブジェクトがCovarianceTestアプリ{延び デフprintAnimalName(動物:リスト[AnimalC]):ユニット= { animals.foreach(=>のprintln(animal.name)動物) } リスト[CATC] =リスト(CATC( "トム")、CATC( "ジャック")):ヴァル猫 ヴァル犬:リスト[DogC] =一覧(DogC( "Nill")、DogC( "ジム")) printAnimalName(猫) printAnimalName(犬) }