2012-10-14 11 views
5

Ich bin neu in Scala, und derzeit lernen, über Typ Parameter in Scala, wo ich auf das folgende Szenario stieß.Subtyping und Typ Parameter in Scala

Angenommen, ich habe 2 Klassen A und B, wo B ein Subtyp von A ist.

class A { 
... 
} 

class B extends A { 
... 
} 

So kann ich B <: A sagen.

Bedeutet dies auch List[B] <: List[A]?

+3

Es ist auch gut erklärt es die Scala Kurse von Martin Odersky (https://class.coursera.org/progfun-2012-001/lecture/83), aber Sie müssen sich anmelden, aber es lohnt sich es :-) –

Antwort

19

Im Fall der Liste bedeutet es B <: A tatsächlich implizieren List[B] <: List[A], weil List-Typ Parameter kovariant ist. Eine Typparameterkovariante zu erstellen bedeutet, dass sie nur in kovarianten Positionen in der Definition von List angezeigt werden kann, d. H. Sie kann nur als Rückgabetyp einer Methode und nicht als Typ eines Parameters angezeigt werden. Die "Tour von Scala" enthält einen Abschnitt über variance. Wikipedia hat auch eine gute article about variance. Die drei Optionen für die Varianz eines Typ-Parameter sind:

  • Invarianz: C[A] kein Subtyp von C[B] ist, egal, was die Beziehung zwischen A und B ist. Beispiele hierfür sind veränderbare Datenstrukturen wie Arrays.
  • Kovarianz: B <: A bedeutet C[B] <: C[A]. Beispiele sind unveränderbare Datenstrukturen oder der Rückgabetyp von Funktionen.
  • Kontravarianz: A <: B bedeutet C[B] <: C[A]. Zum Beispiel sind Funktionen in den Typen ihrer Parameter kontravariant.