Frage

auf gattungs Argumente -

In Scala Varianz kann mit Varianz Operatoren wie + und definiert werden. Zum Beispiel ist der List Typ covariant in der Standardbibliothek.

class List[+A]

So eine Funktion mit einer kovarianten Liste kann wie folgt definiert werden:

def foo[A](list : List[A])

Auch kann Varianz mit generischen Grenzen emuliert wird. So können wir auch diese

schreiben
def foo[A](list : List[_:< A])

Natürlich macht dies keinen Sinn, weil list bereits covariant ist. Aber der gleiche Trick könnte für Arten getan werden, die nicht covariant sind. (Wie Stack). Natürlich auch eine neue Art von Stapel (Vererbung von Aggregation) erstellt, die kovariante ist werden.

Also meine Fragen:

  1. Wann sollte die Verwendung generische Grenzen für Varianz sein? Und wann sollten wir einen neuen covariant Typen erstellen?
  2. Sind nur generische Grenzen nützlich für die Varianz, oder können sie erklären, mehr (Sprachkonzepte).
  3. Wenn sie Varianz nur dann sinnvoll sind, sind Grenzen dann nur für die Kompatibilität mit Java?

thx im Voraus:)

War es hilfreich?

Lösung

Wenn ein Typ natürlich kovarianten oder kontra sollten Sie es so erklären. Ihre Benutzer werden es Ihnen danken. Die Verwendung Ort Varianz ist in der Tat vor allem dort wegen Java. Genauer gesagt ist ein Typ wie Array[T <: Number] als Abkürzung für eine existenzielle Art behandelt:

ArrayBuffer[T] forSome { type T <: Number }

existentielle Typen haben eine ziemlich sperrig Syntax in Scala. Das ist irgendwie gewollt, weil wir diese nicht empfehlen verwenden viel. Wann möchten Sie eine existenzielle Art brauchen?

  1. Um das Analogon eines Java-Typ mit Wildcards, wie List<? extends Number> zu schreiben.
  2. Um das Analogon einer Java rohen Art, wie List zu schreiben.

In Java, rohe Typen und Wildcard-Typen sind nicht ganz das gleiche, und weder ist ganz dasselbe wie eine existenzielle Art (auch wenn wir wissen, was sie nicht sind, es ist ziemlich schwer zu Staat genau das, was sie sind). Aber sie sind nahe genug, um Existenziale in der Praxis, so dass Scala entkommt mit ihnen Mapping auf diese Art von Art.

Andere Tipps

  1. Wenn Sie eine neue generische Art zu schaffen, sagen Foo [T], sollten Sie hart versuchen, festzustellen, ob dieser Typ kovariant, kontra oder unveränderlich und erklären es Foo [+ T], Foo [-T] oder Foo [T] beziehungsweise. Zwar kann dies ein wenig schwierig sein. Allerdings befreit es den Benutzer von Foo von einer solchen Entscheidung jedesmal, wenn sie durch generische Grenzen eines Foo verwenden muss. Kurz gesagt: es vorziehen Erklärung Website Varianz über Varianz Aufrufort wenn die Varianz eine Eigenschaft des Typs selbst ist.

die Programmierung in Scala Buch von Martin Odersky, Lex Löffel und Bill Venners BTW, hat einige große seactions über Varianz. Siehe Kapitel 19 Typ Parametrisierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top