制作逆变对象

时间:2014-02-18 21:45:04

标签: scala contravariance

我正在尝试创建一个逆变的类:

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]       ^

如何解决此错误?

1 个答案:

答案 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]