Minimales Framework in Scala für Sammlungen mit erbendem Rückgabetyp

Angenommen, man möchte eine neuartige generische Klasse bauen,Novel[A]. Diese Klasse enthält viele nützliche Methoden - möglicherweise handelt es sich um eine Art Sammlung - und daher möchten Sie sie in Unterklassen unterteilen. Sie möchten jedoch, dass die Methoden den Typ der Unterklasse und nicht den ursprünglichen Typ zurückgeben. Was ist in Scala 2.8 der minimale Arbeitsaufwand, der erforderlich ist, damit die Methoden dieser Klasse die relevante Unterklasse und nicht das Original zurückgeben? Beispielsweise

class Novel[A] /* What goes here? */ {
  /* Must you have stuff here? */
  def reverse/* What goes here instead of :Novel[A]? */ = //...
  def revrev/*?*/ = reverse.reverse
}
class ShortStory[A] extends Novel[A] /* What goes here? */ {
  override def reverse: /*?*/ = //...
}
val ss = new ShortStory[String]
val ss2 = ss.revrev  // Type had better be ShortStory[String], not Novel[String]

Ändert sich dieser minimale Betrag, wenn Sie möchtenNovel kovariant sein?

(Die 2.8-Sammlungen tun dies unter anderem, aber sie spielen auch auf ausgefallenere (und nützlichere) Weise mit Rückgabetypen - die Frage ist, mit wie wenig Rahmen man davonkommen kann, wenn man nur diese Subtypen-always-return- will. Untertypen-Funktion.)

Edit: Nehmen Sie im Code darüber an, dassreverse macht eine Kopie. Wenn man Änderungen an Ort und Stelle vornimmt und sich dann selbst zurückgibt, kann man @ verwendethis.type, aber das funktioniert nicht, weil die Kopie nicht @ ithis.

Arjan ist mit einer anderen Frage verknüpft, die die folgende Lösung vorschlägt:

def reverse: this.type = {
  /*creation of new object*/.asInstanceOf[this.type]
}

Das liegt grundsätzlich am Typensystem, um zu bekommen, was wir wollen. Dies ist jedoch keine wirkliche Lösung, da der Compiler jetzt, da wir das Typsystem angelogen haben, uns nicht helfen kann, sicherzustellen, dass wir wirklichtu bekomme einShortStory zurück, wenn wir denken, dass wir es tun. (Zum Beispiel müssten wir @ nicht überschreibreverse im obigen Beispiel, um den Compiler glücklich zu machen, aber unsere Typen wären nicht das, was wir wollten.)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage