假设我的课程定义如下:
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类继承MongoRecord [A],但由于MongoRecord的不变性,MongoRecord [B]不能替代MongoRecord [A]。因此,B类不符合类型约束。知道如何解决这个问题吗?非常感谢。
答案 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]或任何其他类似特征。