Scalaのエントリーノート - ジェネリック関連

[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(犬)
}

  

 

おすすめ

転載: www.cnblogs.com/sunnystone85/p/11371417.html