制作逆变对象

Kev*_*ith 1 scala contravariance

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

class ContraObj[-T] {
  var item: T = _                 // initialize `item` to "some" T value
  def replace(t: T) = (item = t) 
}
Run Code Online (Sandbox Code Playgroud)

但是发生以下编译时错误:

[error] .../ContraObj.scala:4: contravariant type T occurs in covariant 
   position in type => T of method item
[error]   var item: T = _
[error]       ^
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

whe*_*ies 5

你需要考虑逆变意味着什么.也就是说,它意味着什么以及由此产生的约束.因此,

trait Foo[-T]{
  def stuff(t: T): T
}
Run Code Online (Sandbox Code Playgroud)

现在想想在以下背景下这意味着什么:

def action(that: Foo[Int]) = that.stuff(1)
Run Code Online (Sandbox Code Playgroud)

如果我传递一个Foo[Any].这是否意味着,如果我希望以下定义能够Int将其提交给我,那么它将会成功吗?

def action(that: Foo[Int]): Int = that.stuff(1)
Run Code Online (Sandbox Code Playgroud)

它不能,可以吗?那是因为你定义的是一个函数和函数作为它们的签名Function[-T, +R],你试图将它定义为Function[-T, -T].