Seq [+ A]如何在A中协变?

Mic*_*ael 6 scala covariance

如果A出现在逆变位置,Seq [+ A]如何在A中是协变的:

def :+ (elem: A) : Seq[A] ?
Run Code Online (Sandbox Code Playgroud)

据我所知,方法参数类型是逆变位置.我错过了什么?

Dan*_*ral 10

这是用例签名.它不是真正的签名,只是您在常见用例中通常会看到的内容.

真正的签名是:

def :+ [B >: A, That] ( elem : B )(implicit bf : CanBuildFrom[Seq[A], B, That] ) : That
Run Code Online (Sandbox Code Playgroud)

如你所见,这甚至不能保证Seq回报,更不用说了A.

  • 在Daniel所说的基础上,集合方法返回_a new collection_,这些可以扩展类型.所以,是的,一个`Seq [A]`只能包含`A`s,但是你的新`Seq`可以扩展它的类型,这样它就可以包含的不仅仅是'A`. (5认同)
  • 用例签名使用`:+(elem:A):Seq [A]`而不是`:+ [B>:A](elem:B):Seq [B]`尽管如此,这有点遗憾. (3认同)