2012-06-18 100 views
1

如何將對象的字段/方法與類型綁定?綁定對象的字段/方法

我試圖做的事:

object CRUDable { 

    private val allCRUDables = scala.collection.mutable.Map[String, CRUDableMeta[_]]() 
    def add(crudable: CRUDableMeta[_]) { allCRUDables += (crudable.name -> crudable) } 

和我的編譯器是最高審計機關:

type arguments [_$5] do not conform to trait CRUDableMeta's type parameter bounds [T <: etam.jpa.crud.CRUDable[T]] 

我需要的地圖,以接受任何類型CRUDableMeta [_]的。

在此先感謝,Etam。

回答

0

這是我在自由構建一個一般的情況下,因爲我不知道CRUD,它並沒有起到作用:

trait Data[T] 
trait Meta[T <: Data[T]] { def name: String } 
val all = collection.mutable.Map[String, Meta[_]]() 

現在,編譯器會告訴你什麼是錯的

def add(c: Meta[_]) { all += c.name -> c } 

它說:

error: type arguments [_$1] do not conform to trait 
     Meta's type parameter bounds [T <: Data[T]] 

所以,當斯卡拉讓您構建Map沒有抱怨(老實說我不知道​​爲什麼),當你嘗試實際存儲地圖中的值時,你遇到了Meta的類型參數T的界限。

解決方案是使用以下任一種形式。 (1)該方法的類型參數:

def add[T <: Data[T]](c: Meta[T]) { all += c.name -> c } 

(2)生存型

def add(c: Meta[T] forSome { type T <: Data[T] }) { all += c.name -> c } 

不要問我(2),我一直忘了什麼存在的類型都是關於..也許其他人可以在這裏提供一個關於(1)或(2)是否更好的見解。 (the only answer to a related question表明(1)和(2)幾乎相同,其中(1)還允許您隨後引用T類型。雖然在這裏沒有必要,但它仍然是可讀性更高的版本,我會說)

相關問題