Ich versuche, ein besseres Verständnis für das folgende Verhalten zu erhalten:Scala Typ Grenzen & Varianz
scala> class C[-A, +B <: A]
<console>:7: error: contravariant type A occurs in covariant position
in type >: Nothing <: A of type B
class C[-A, +B <: A]
^
jedoch folgende Arbeiten:
scala> class C[-A, +B <% A]
defined class C
ich sehen kann, dass es Fragen aus dem sein könnte Varianz der begrenzenden und beschränkten Variablen ist entgegengesetzt, obwohl ich nicht klar bin, was das spezifische Problem ist. Ich bin noch weniger klar darüber, warum die Änderung des Typs, der an eine Ansicht gebunden ist, die Dinge in Ordnung bringt. In Ermangelung anwendbarer impliziter Umrechnungen würde ich erwarten, dass die beiden Definitionen weitgehend denselben Effekt haben. Wenn überhaupt, würde ich erwarten, dass eine Sichtweise mehr Möglichkeiten für Unfug bietet.
Für ein bisschen Hintergrund I-Klassen definieren, die in gewisser Weise wie Funktionen sind, und ich wollte so etwas wie
CompositeFunc[-A, +B <: C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
Diskutierbar
CompositeFunc[-A, +B <% C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
ist eigentlich bevorzugt tun, aber ich würde immer noch mag es besser zu verstehen, was hier vor sich geht.
Intriguing ... I 1 Stunde lang die Suche nach einem Beispiel, bei dem Typ Sicherheit bricht mit dem gebundenen Typ. Keine gefunden :( – gzm0
Auch wenn es ein Beispiel gab, das mit dem Typ gebunden war, ist es schwer zu sehen, wie das Ersetzen in einer Ansichtsgrenze es beheben würde. –
Ja, ich stimme etwas zu. Aber der grundlegende Unterschied ist, dass die Ansicht gebunden ist konvertiert immer nach den Typen, mit denen die Klasse erstellt wurde, während dies bei dem gebundenen Typ nicht unbedingt der Fall ist (sagt zumindest meine Intuition ...) – gzm0