Scala – Covarianza

La varianza es la interconexión de las relaciones de subtipificación que son de tipos complicados o de sus tipos constituyentes. Scala proporciona tres tipos de varianza:

  • covariante
  • contravariante
  • Invariante

La covarianza establece que si hay dos tipos parametrizados tales que S es un subtipo de T, entonces List[S] es un subtipo de List[T]. Esta es una relación de herencia. Entonces, esto define básicamente la relación de si podemos reemplazar un tipo por su tipo base. Simplemente poniéndolo en palabras, si tomamos un ejemplo donde Car es un subtipo de Vehicle, entonces List[Car] es un subtipo de List[Vehicle]. Por lo tanto, podemos reemplazar List[Car] por List[Vehicle]. Cuando declaramos que un tipo es covariante, su uso seguro en varias posiciones se vuelve limitado. En el caso de tipos inmutables, la covarianza se usa ampliamente.
Sintaxis:

List[+T]

Aquí, T es un parámetro de tipo y el símbolo «+» representa la covarianza de Scala.

Discutamos este concepto con la ayuda de ejemplos:
Ejemplo 1:

// Scala program to illustrate the concept of covariance
  
// Creating an abstract class 
// for Flower 
abstract class Flower 
{
    def name: String
}
  
// Creating a sub-class Lily 
// of Flower 
case class Lily(name: String) extends Flower
  
// Creating a sub-class Carnation
// of Flower 
case class Carnation(name: String) extends Flower 
object Covariance extends App
{
      
    // Creating a method
    def FlowerNames(flowers: List[Flower]): Unit =
    {   
        flowers.foreach 
        {
            flower => println(flower.name)
        }
    }
      
    // Assigning names
    val lily: List[Lily] = List(Lily("White Lily"), 
                                Lily("Jersey Lily"))
    val carnations: List[Carnation] = List(Carnation("White carnations"),
                                           Carnation("Pink carnations"))
  
    // Print: names of lily 
    FlowerNames(lily)
  
    // Print: names of carnation 
    FlowerNames(carnations)
}

Producción:

White Lily
Jersey Lily
White carnations
Pink carnations

Explicación: En el ejemplo anterior, Lily y Carnation son subtipos de Flower. Entonces, es evidente que una Lista[Lirio] es una Lista[Flor] y una Lista[Clave] es también una Lista[Flor], y podemos sustituir cualquiera de ellas por una Lista[Flor]. En la última parte del código, hay un método FlowerNames que imprime nombres de flores y el argumento aceptable es una lista de flores. Si las dos listas son covariantes, solo entonces se compilarán las llamadas al método y se imprimirán los nombres de las flores, respectivamente. Entonces, como Lily y Carnation son un subtipo de Flowers y las dos últimas líneas se ejecutarán debido a la covarianza.
Nota:

  • La clase abstracta se utiliza aquí para aplicar la covarianza, ya que tiene List[+T] donde el parámetro de tipo T es covariante.
  • Aquí se utiliza una aplicación de características para convertir rápidamente objetos en programas viables.

Ejemplo 2:

// Scala program to illustrate the concept of covariance
  
// Creating an abstract class 
// for Animal
abstract class Animal 
{
    def name: String
}
  
// Creating a sub-class Mammal
// of Animal 
case class Mammal(name: String) extends Animal
  
// Creating a sub-class Reptile
// of Animal 
case class Reptile(name: String) extends Animal 
  
object CovarianceExample extends App
{
      
    // Creating a method
    def SpecieNames(animals: List[Animal]): Unit =
    {   
        animals.foreach 
        { 
            animal =>println(animal.name)
        }
    }
      
    // Assigning names
    val mammals: List[Mammal] = List(Mammal("Zebra"), 
                                     Mammal("Horse"))
    val reptiles: List[Reptile] = List(Reptile("Snake"), 
                                       Reptile("Lizard"))
  
    // Print: names of mammals
    SpecieNames(mammals)
  
    // Print : names of reptiles
    SpecieNames(reptiles)
}

Producción:

Zebra
Horse
Snake
Lizard

Publicación traducida automáticamente

Artículo escrito por devanshigupta1304 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *