En Scala, la varianza se puede definir con operadores de varianza como + y - en el argumento de tipo genérico. Por ejemplo, el tipo List
es covariante en la biblioteca estándar.Al usar anotaciones de covarianza o límites genéricos en Scala
class List[+A]
lo tanto una función con una lista covariante puede definirse así:
def foo[A](list : List[A])
También varianza puede ser emulada con los límites genéricos. Así también podemos escribir esta
def foo[A](list : List[_:< A])
por supuesto esto no tiene sentido, porque ya está list
covariante. Pero el mismo truco podría hacerse para los tipos que no son covariantes. (como Stack
). Por supuesto, también se podrían crear nuevos tipos a partir de la pila (herencia de la agregación) que sea covariante.
Así que mis preguntas:
- Cuando debe ser Utilizar límites genéricos para la varianza? ¿Y cuándo deberíamos crear un nuevo tipo de covariante?
- Los límites genéricos solo son útiles para la varianza, o pueden declarar más (conceptos de lenguaje).
- Si solo son útiles para la varianza, ¿son límites solo para la compatibilidad con Java?
THX de antemano :)
Doblo esta pregunta: la varianza es la parte más dura de Scala y en realidad no la entiendo bastante bien. "Blah-blah covariant blah apareció en la posición contravariante bla-bla": p – Jeriho
Entendí la varianza cuando miré las definiciones de algunos de los rasgos de la Función (Función1, Función2, etc.) Los rasgos de la función son todos covariantes en el tipo de salida y contravariante en los tipos de entrada (parámetro). Por ejemplo, una función de tipo 'Any => Unit' puede usarse donde se espera una función de tipo' String => Unit', porque la función 'Any => Unit' puede tomar una cadena como su entrada (porque puede tome algo como su entrada.) Esta es la razón por la cual los tipos de parámetros del método son una "posición contravariante". –