我正在处理Cell,我有一个问题,因为它们不是协变的。这就是我想要做的事情:
import net.liftweb.util.Cell
trait A {}
class AA extends A {}
trait T{
val cell:Cell[A]
}
class U extends T{
val cell:Cell[AA] = //implementation
}
我有一个错误,因为AA
是A
的后代,但不等于A
。
有解决方案吗?
答案 0 :(得分:2)
实际上,你错了。您的错误是“错误:在Cell [AA]类型的特征T中覆盖值单元格;方法单元格需要是一个稳定的,不可变的值:def cell:Cell [AA]”。
现在,虽然我可能建议让T取一个类型参数V<:A然后让cell()函数返回一个Cell [V],这里真正的问题实际上并不是真的与仿制药有关。在T中,您的“单元格”是数据成员。在U中,'cell'是一个函数。编译器只是希望你选择一个(并且有效的那个是有意义的,因为它在两个地方都是一个函数,所以...只需将“val cell”更改为“def cell”并给出其中一个'单元格'定义一个实现,你没事。)
更新(现在问题已修复):
好吧,所以,正如我原来的答案中所建议的那样,你需要特质T来取一个类型参数来解决这个问题,如下所示:
trait A {}
class AA extends A {}
trait T[V <: A]{
val cell:Cell[V]
}
class U(inCell: Cell[AA]) extends {val cell = inCell} with T[AA]
答案 1 :(得分:2)
来自scaladoc定义trait Cell [T] extends Dependent
,Cell 不协变
val
可以覆盖无参数方法,但反之亦然。
类U
应该是抽象的或cell
函数定义。
如果Cell
是协变的,那么通过这些更改,您的示例应该有效。
scala> trait Cell[+T]
defined trait Cell
scala> trait A
defined trait A
scala> class AA extends A
defined class AA
scala> trait T { def cell: Cell[A] }
defined trait T
scala> class U extends T { override def val: Cell[AA] = new Cell[AA] {} }
defined class U