Минимальный каркас в Scala для коллекций с наследуемым типом возврата

Предположим, кто-то хочет создать новый родовой класс,Novel[A], Этот класс будет содержать много полезных методов - возможно, это тип коллекции - и поэтому вы хотите создать его подкласс. Но вы хотите, чтобы методы возвращали тип подкласса, а не исходный тип. В Scala 2.8, какой минимальный объем работы нужно выполнить, чтобы методы этого класса возвращали соответствующий подкласс, а не оригинал? Например,

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]

Меняется ли эта минимальная сумма, если вы хотитеNovel быть ковариантным?

(Коллекции 2.8 делают это среди прочего, но они также играют с возвращаемыми типами более причудливыми (и полезными) способами - вопрос в том, как мало фреймворка может сойти с рук, если нужно только подтипы-всегда-возвращать-подтипы особенность.)

Изменить: Предположим, в коде выше, чтоreverse делает копию. Если кто-то делает модификацию на месте, а затем возвращает себя, можно использоватьthis.type, но это не работает, потому что копия неthis.

Арджан связал с другим вопросом, который предлагает следующее решение:

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

который в основном лежит на системе типов, чтобы получить то, что мы хотим. Но на самом деле это не решение, потому что теперь, когда мы обманули систему типов, компилятор не может помочь нам убедиться, что мы действительноделать получитьShortStory назад, когда мы думаем, что мы делаем. (Например, нам не нужно переопределятьreverse в приведенном выше примере, чтобы сделать компилятор счастливым, но наши типы не были бы тем, что мы хотели.)

Ответы на вопрос(3)

Ваш ответ на вопрос