2012-01-22 51 views
0

我處理Cell,我有一個問題,因爲它們不是協變的。這是我想做的事:LiftWeb不是協變類型細胞

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

其實,你錯了。你的錯誤是「錯誤:在Cell [AA]類型的特徵T中覆蓋值單元;方法單元需要是穩定的,不可變的值:def cell:Cell [AA]」。現在,雖然我可能建議讓T採取類型參數V <:然後讓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] 
+0

嗨,感謝您的幫助,但是您指出的僅僅是一個錯字,當我「翻譯」我的問題時,我會編輯我的問題來澄清我的觀點。 –

+0

@ChrisJamesC好的。我已經更新了我的答案。 – Destin

+0

我測試您的解決方案,我仍然有一個問題:首先,我有以下錯誤:「你不妨定義V作爲-V,而不是」,然後當我插入負我「發生在類型不變的位置逆變式V = > net.liftweb.util.Cell值單元格的[V]「。 所以它看起來像訣竅不成立。 –

2
  1. 從scaladoc定義trait Cell [T] extends DependentCell

  2. val可以重寫參數方法,但是反之則不行。

  3. 無論哪種類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 
+0

嗨,謝謝你的回答,但是我在創建我的問題時犯了一些錯誤。我後來編輯它。 在你的回答中,當你鍵入'trait Cell [+ T]'時,這是升降單元的實現還是這是一個全新的特性,沒有任何前身?因爲我需要Cell的屬性 –

+0

@ChrisJamesC,它是全新的協​​變'Cell';在電梯實現中'Cell'具有不變的類型參數。見Destin的答案,那可能就是你想要的。 – 4e6