Как обойти неизменность MongoRecord в Scala - PullRequest
3 голосов
/ 16 октября 2011

Скажем, у меня есть класс, определенный следующим образом:

class A extends MongoRecord[A]{

}

Теперь мне нужно создать новый класс B, который является подклассом A:

class B extends A{

}

Object B extends B with MongoMetaRecord[B]

Компилятор выдаст ошибку вроде: аргументы типа [B] не соответствуют границам параметров типа trait MongoMetaRecord [BaseRecord <: net.liftweb.mongodb.record.MongoRecord [BaseRecord]] <br /> [ошибка] объект B расширяет B с помощью MongoMetaRecord [B]

Кажется, что класс B наследует MongoRecord [A], но из-за неизменности MongoRecord MongoRecord [B] не может заменить MongoRecord [A]. И поэтому класс B не соответствует ограничению типа. Есть идеи, как обойти эту проблему? Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Вы не сможете обойти инвариантность, но вместо того, чтобы иметь B подкласс A, возможно, создаст черту ALike вместо .Вы можете превратить A в черту и создать ARecord.

trait ALike {
  // all the common stuff
}
class A extends ALike with MongoRecord[A] {
}
class B extends ALike with MongoRecord[B] {
}
0 голосов
/ 02 сентября 2013

Это поздний ответ, но, может быть, кто-то найдет его полезным;)

abstract class A[U <: A[U]] extends MongoRecord[U] with ... with ObjectIdPk[U] with ... {
  self: U =>

  object text extends StringField(this, 255)

  ... // other fields
}

class B extends A[B] {
  override def meta = B

  ... // add more fields or methods
}

object B extends B with MongoMetaRecord[B] {
  ...
}

Вы можете использовать ProtoAuthUser [U] вместо MongoRecord [U] или любой другой подобной черты.

0 голосов
/ 23 февраля 2012

На самом деле код, вероятно, не будет компилироваться, потому что компилятор будет жаловаться, что метод "meta" и "id" должен быть реализован с правильными типами, но идея решения направлена ​​в правильном направлении.class A extends ALike with MongoRecord[A] with MongoId[A] { def meta = A }

class B extends ALike with MongoRecord[B] with MongoId[B] { def meta = B }

object A extends A with MongoMetaRecord[A]

object B extends B with MongoMetaRecord[B]

...