LiftWeb不是Covariant Type In Cell

时间:2012-01-22 18:35:15

标签: scala lift

我正在处理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
}

我有一个错误,因为AAA的后代,但不等于A

有解决方案吗?

2 个答案:

答案 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)

  1. 来自scaladoc定义trait Cell [T] extends DependentCell 协变

  2. val可以覆盖无参数方法,但反之亦然。

  3. U应该是抽象的或cell函数定义。


  4. 如果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