Ich habe gelernt, dass Scala Objekt-private (private[this]
) oder Objekt-geschützte (protected[this]
) Definitionen für ihre Varianz-Position nicht überprüft. Warum ist es sicher, sie nicht zu überprüfen?Warum ist es sicher, Objekt-private oder Objekt-geschützte Definitionen nicht für ihre Varianzposition zu überprüfen?
Ich habe einige damit verbundene Materialien gelesen, konnte aber noch keine vollständige Antwort finden. . Zuerst Odersky, et al die „Programmierung in Scala“, sagt:
http://www.artima.com/pins1ed/type-parameterization.html#19.7
Es stellt sich heraus, dass die Zugriffe auf Variablen aus dem gleichen Objekt, in dem sie definiert sind keine Probleme mit der Varianz verursachen. Die intuitive Erklärung ist, dass, um einen Fall zu konstruieren, in dem Varianz zu Typfehlern führt, ein Verweis auf ein enthaltendes Objekt erforderlich ist, das einen statisch schwächeren Typ als den Typ aufweist, mit dem das Objekt definiert wurde.
Ich bin nicht sicher, genau zu wissen, was die Autoren bedeuten durch „ein Objekt enthält“ und „ein statisch schwächeren Typ“. Ein Codebeispiel wäre hier vorzuziehen.
Zweitens, "senia" gab ein gutes Beispiel in Scala Modifiers and Type parametrization, die zeigt, welches Problem Klasse-private (private
) Felder mit Varianz haben können. Das Beispiel überzeugt mich, warum class-private Mitglieder auf ihre Varianzpositionen überprüft werden sollten, gab aber keine Antwort auf den Grund, warum wir Objekt-private/geschützte Definitionen nicht überprüfen müssen. Ich verstehe, dass ein solcher Code wie getOtherCache()
nicht mit Objekt-private Felder geschrieben werden kann. Aber es gibt keinen Beweis für die Unschädlichkeit von objekt-privaten/projizierten Definitionen, dass wir kein Programm geschrieben haben, dass objekt-private/projizierte Definitionen Probleme mit der Varianz verursachen.
Drittens Michid das Thema kurz erwähnt, während decsribing wie Funktion memoization in Scala zu implementieren:
http://michid.wordpress.com/2009/02/23/function_mem/
class Memoize1[-T, +R](f: T => R) extends (T => R) { ... private[this] val vals = mutable.Map.empty[T, R] ... }
jedoch nur von seiner enthält Instanz zugegriffen, da vals, kann es nicht zu Problemen führen mit Abweichung.
Leider beantwortet es meine Frage nicht "wie (oder warum) ist die Zugriffskontrolle auf Varianz bezogen?".
Können Sie näher erklären, warum Objekt-private/geschützte Definitionen nicht auf ihre Varianzposition hin überprüft werden (oder Referenzen geben)? nur