文档章节

为什么需要协变 逆变

jinlei_du
 jinlei_du
发布于 2017/02/24 17:14
字数 421
阅读 0
收藏 0

#为什么需要协变 逆变

凡事物的产生必有其因,一个概念的产生也非平白无故,协变 逆变是在泛型的基础上孕育出来。类型系统中,泛型提供了基于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那样能够有型变的能力

© 著作权归作者所有

共有 人打赏支持
上一篇: 何为Akka Actor
下一篇: 何为Akka Actor
jinlei_du
粉丝 0
博文 2
码字总数 1031
作品 0
闵行
程序员
私信 提问
C# 4.0新特性-"协变"与"逆变"以及背后的编程思想

在《上篇》中我们揭示了“缺省参数”的本质,现在我们接着来谈谈C#4.0中另一个重要的新特性:协变(Covariance)与逆变(Contravariance)。对于协变与逆变,大家肯定不会感到陌生,但是我相...

长平狐
2012/09/04
390
0
Java中逆变与协变

看下面一段代码 Number num = new Integer(1); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch List<? extends Number> list = new ArrayList<Number>();list.add(new......

Hosee
2016/02/25
159
0
协变和逆变(转载)

前言 个人感觉协变(Covariance)与逆变(Contravariance)是 C# 4 中最难理解的一个特性了,因为 C# 4 用了一个非常直观的语法(和关键字),在很多情况下,这似乎很简单,用于输入的参数,用于...

jeffcky
2015/08/15
0
0
谈谈.Net中的协变和逆变

谈谈.Net中的协变和逆变 关于协变和逆变要从面向对象继承说起。继承关系是指子类和父类之间的关系;子类从父类继承所以子类的实例也就是父类的实例。比如说Animal是父类,Dog是从Animal继承的...

长平狐
2012/06/08
87
0
Scala的协变covariant(+),逆变contravariant(-),上界(:)

原文:https://my.oschina.net/xinxingegeya/blog/486671 Scala的协变(+),逆变(-),上界(<:),下界(>:) 协变covariant、逆变contravariant、不可变invariant 对于一个带类型参数的类型,比如...

u013063153
2017/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部