为什么scala List可以将协变类型作为方法+=中的参数
Why scala List could take covariant type as paramenter in method +=
Scala 列表声明为
sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A, List] with LinearSeqOptimized[A, List[A]] with java.io.Serializable
将元素添加到 List 的方法声明为
def +:(elem: A): List[A]
既然类型A是协变的,为什么A出现在+:的逆变位置编译器不报错?
因为它的完整签名是:
def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That
你在问题中提到的文档只是简化的文档,你需要检查方法的完整签名。
Scala 列表声明为
sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A, List] with LinearSeqOptimized[A, List[A]] with java.io.Serializable
将元素添加到 List 的方法声明为
def +:(elem: A): List[A]
既然类型A是协变的,为什么A出现在+:的逆变位置编译器不报错?
因为它的完整签名是:
def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That
你在问题中提到的文档只是简化的文档,你需要检查方法的完整签名。