如何解决Scala中MongoRecord的不变性

时间:2011-10-15 23:54:06

标签: scala mongodb lift

假设我的课程定义如下:

class A extends MongoRecord[A]{

}

现在我需要创建一个新的B类,它是A:

的子类
class B extends A{

}

Object B extends B with MongoMetaRecord[B]

编译器会给出如下错误: 类型参数[B]不符合特征MongoMetaRecord的类型参数边界[BaseRecord&lt ;:net.liftweb.mongodb.record.MongoRecord [BaseRecord]]
[错误]对象B使用MongoMetaRecord [B]

扩展B.

似乎B类继承MongoRecord [A],但由于MongoRecord的不变性,MongoRecord [B]不能替代MongoRecord [A]。因此,B类不符合类型约束。知道如何解决这个问题吗?非常感谢。

3 个答案:

答案 0 :(得分:2)

你将无法绕过不变性而不是让B成为一个子类A,而不是改为使用ALEND特征。你可以把A变成一个特质并创建一个ARecord。

trait ALike {
  // all the common stuff
}
class A extends ALike with MongoRecord[A] {
}
class B extends ALike with MongoRecord[B] {
}

答案 1 :(得分:0)

实际上代码可能不会编译,因为编译器会抱怨方法“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]

答案 2 :(得分:0)

这是一个迟到的回应,但也许其他人会觉得它很有用;)

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]或任何其他类似特征。