特性 AdvertisementDAO の型パラメーター A を共変として定義しようとしているようです。以下は、共分散アノテーション + を使用した、前の回答のコード例の変形です。
trait Advertisement {}
class AdvertisementImpl extends Advertisement{}
class CrudRepository[+A,B] {}
trait AdvertisementDAO[+A <: Advertisement] extends CrudRepository[A, Integer] {}
class AdvertisementDAOImpl[+A <: Advertisement] extends AdvertisementDAO[A]{}
class AdvertisementDAOImpl2 extends AdvertisementDAO[AdvertisementImpl]{}
class AdvertisementDAOImpl3 extends AdvertisementDAO[Advertisement]{}
object Tester
{
def main(args:Array[String]):Unit =
{
var advertisementDAO: AdvertisementDAO[Advertisement] = null
advertisementDAO = new AdvertisementDAOImpl
advertisementDAO = new AdvertisementDAOImpl2
advertisementDAO = new AdvertisementDAOImpl3
}
}
共変ジェネリックの別の例は、scala.collection.immutable.List です。ジェネリック (クラスまたはトレイト) C を共変として定義することは、型 S が型 T のサブタイプである場合、C[S] が C[T] のサブタイプであることを意味します。たとえば、AdvertisementDAO[AdvertisementImpl] は AdvertisementDAO[Advertisement ] AdvertisementImpl は Advertisement サブタイプであるため (AdvertisementImpl は Advertisement を拡張するため)。多くの言語 (Scala、C#、Java など) で発生する分散に関するチュートリアルを含む 論文を公開しました。概要を簡単に確認できるスライドも用意されています。お役に立てれば。