我正在尝试创建一个逆变的类:
class ContraObj[-T] {
var item: T = _ // initialize `item` to "some" T value
def replace(t: T) = (item = t)
}
但是发生以下编译时错误:
[error] .../ContraObj.scala:4: contravariant type T occurs in covariant
position in type => T of method item
[error] var item: T = _
[error] ^
如何解决此错误?
答案 0 :(得分:5)
你需要考虑逆变意味着什么。也就是说,它意味着什么以及由此产生的约束。因此,
trait Foo[-T]{
def stuff(t: T): T
}
现在想想在以下背景下这意味着什么:
def action(that: Foo[Int]) = that.stuff(1)
如果我传给Foo[Any]
。这是否意味着,如果我希望以下定义能够将Int
提交给它,那么它会成功吗?
def action(that: Foo[Int]): Int = that.stuff(1)
它不能,可以吗?那是因为您定义的是一个函数,函数具有签名Function[-T, +R]
,并且您尝试将其定义为Function[-T, -T]
。