为什么需要协变 逆变
为什么需要协变 逆变
jinlei_du 发表于11个月前
为什么需要协变 逆变
  • 发表于 11个月前
  • 阅读 0
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

#为什么需要协变 逆变

凡事物的产生必有其因,一个概念的产生也非平白无故,协变 逆变是在泛型的基础上孕育出来。类型系统中,泛型提供了基于concept进行编程能力,可以用于创建一个标准容器库基于相同模板来处理不同类型。 进一步,为了分配和使用泛型类型方面提供更大的灵活性,协变 逆变的概念也被抽离出来。

#何为协变 逆变

  • 协变 能够使用比原始指定的类型派生程度更大的类型。

  • 逆变 能够使用比原始指定的类型更泛型(派生程度更小)的类型。

在Scala 标准库中 trait Function1[-T1, +R] extends AnyRef { self => def apply(v1: T1): R override def toString() = "<function1>" } R声明为协变,我们先固定住T(声明逆变)排除干扰。 val covariant_f1:Int => String = x => ... val covariant_f2:Int => Any = x => ...

covariant_f1 返回值类型为String,covariant_f2为Any而且String是Any的子类型, covariant_f2可用的地方,covariant_f1都可用,反之无效,根据里氏替换原则子类可以任意替换父类, 那么Function[Int,String]应该算作Function[Int,Any]子类型。

同理对于声明为逆变类型的R

val contravariance_f1:Int => String = x => ... val contravariance_f2:Any => String = x => ...

凡是contravariance_f1可以使用的地方,contravariance_f2都是可以用的,既Function[Int,String] 是Function[Any,String]是Function[Any,String]的子类。

从中我们可以看出协变和逆变的引入事为了高阶类型F[A], F[B]之间, 也能像低阶类型A, B那样能够有型变的能力

共有 人打赏支持
粉丝 0
博文 2
码字总数 1031
×
jinlei_du
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: