我想做的是:
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
注意:代码实际上是有效的&编译,如果我不希望T到b协变(即T而不是+ T)。只有当我尝试制作T协变时才会出现错误。
我想要一个+ T的可选列表,可以改变。
答案 0 :(得分:1)
嗯,l
的类型是MutableList[T]
,因此您显然无法使用其他类型调用+=
。
我怀疑您认为l
由于某种原因属于ListField
类型,在这种情况下,被调用的+=
不会是MutableList
,而是{{1 }}的