2014-02-15 74 views
3

我想要做的是:類型不匹配;發現:newValue.type(與基礎型S)要求:T

class ListField[+T] extends Field[MutableList[T]] { 

    value = Some(new MutableList[T]()) 

    def +=[S >: T](newValue: S): Unit = add(newValue) 

    def add[S >: T](newValue: S): Unit = value.map(l => { 

    if (writable_? || !initialized_?) { 

在下一行我得到:

類型不匹配;發現:newValue.type(與基礎型S)所需 :T

 l += newValue 
     validate 
     makeDirty 
     change0.fire(l) 
    } 
}) 

def length: Int = list.length 
//etc 

我該怎麼辦呢?可能嗎?如果我不讓T共同變體,一切都按原樣進行。

領域是:

class Field[T] extends Signal[T] with ChangeStateTracking { 

    private[this] var data: Option[T] = None 

    private var writable = true 

    def writable_? = writable 

    override def now = data.get 

    def value: Option[T] = data 

    def validate: ValidationNel[FieldError, Option[T]] = value.successNel[FieldError] 
//etc 

注:該代碼實際工作&編譯,如果我不想牛逼到b協變(即的T代替+ T)。只有當我嘗試使T協變時纔會出現錯誤。

我想要一個可選列表+ T,可以更改。

+0

您嘗試添加不同類型的l和newValue(即使S是T的子類型),我想您必須明確定義此操作。 – Ashalynd

+1

不是MutableList不變嗎? –

+0

是的。我沒有打擾檢查可變列表的簽名。確實是T,而List是+ T。我將不得不嘗試與清單,看看。 –

回答

1

那麼,l的類型是MutableList[T],所以你顯然不能用其他類型調用+=

我懷疑你認爲lListField類型出於某種原因,在這種情況下,所謂的+=不會MutableList的,但ListField的。

+0

不,完全沒有,我希望'l'是T或T的後代。 –

+0

@JimBarrows'value'is'Option [MutableList [T]]'。你需要映射兩次才能得到'T'。 –

+0

如果我正在更換清單,請更正。但是我添加到列表中,所以我只需要映射選項。 –

相關問題