Scala Language Covariance


Exemple

Le symbole + marque un paramètre de type comme covariant - nous disons ici que "le Producer est covariant sur A ":

trait Producer[+A] {
  def produce: A
}

Un paramètre de type covariant peut être considéré comme un type de "sortie". Marquer A comme covariant affirme que Producer[X] <: Producer[Y] condition que X <: Y Par exemple, un Producer[Cat] est un Producer[Animal] valide, car tous les chats produits sont également des animaux valides.

Un paramètre de type covariant ne peut pas apparaître en position contravariante (entrée). L'exemple suivant ne sera pas compilé car nous affirmons que Co[Cat] <: Co[Animal] , mais Co[Cat] a un def handle(a: Cat): Unit ne pouvant gérer aucun Animal comme requis par Co[Animal] !

trait Co[+A] {
  def produce: A
  def handle(a: A): Unit
}

Une approche pour traiter cette restriction consiste à utiliser des paramètres de type limités par le paramètre de type covariant. Dans l'exemple suivant, nous savons que B est un supertype de A Par conséquent, étant donné l' Option[X] <: Option[Y] pour X <: Y , nous savons que l' Option[X] def getOrElse[B >: X](b: => B): B Option[X] def getOrElse[B >: X](b: => B): B peut accepter n'importe quel supertype de X - qui inclut les supertypes de Y comme requis par l’ Option[Y] :

trait Option[+A] {
  def getOrElse[B >: A](b: => B): B
}