文档章节

为什么需要协变 逆变

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那样能够有型变的能力

© 著作权归作者所有

共有 人打赏支持
jinlei_du
粉丝 0
博文 2
码字总数 1031
作品 0
闵行
程序员
C# 4.0新特性-"协变"与"逆变"以及背后的编程思想

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

长平狐
2012/09/04
38
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
Scala的协变covariant(+),逆变contravariant(-),上界(:)

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

u013063153
2017/11/09
0
0
谈谈.Net中的协变和逆变

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

长平狐
2012/06/08
78
0

没有更多内容

加载失败,请刷新页面

加载更多

SSO单点登录PHP简单版

  前面做了一个新项目,需要用户资源可以需要共享。由于之前没有做过这样的东西,回家之后,立马网站百度“单点登录”。帖子很多,甄别之后,这里列几篇认为比较有营养。   http://blog...

slagga
36分钟前
2
0
Java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1 概述 泛型在j...

hensemlee
40分钟前
2
0
Annotation注解详细介绍

目录介绍 1.Annotation库的简单介绍 2.@Nullable和@NonNull 3.资源类型注释 4.类型定义注释 5.线程注释 6.RGB颜色纸注释 7.值范围注释 8.权限注释 9.重写函数注释 10.返回值注释 11.@Keep注释...

潇湘剑雨
41分钟前
2
0
一步步编写自己的PHP爬取代理IP项目(二)

这一章节我们正式开展我们的爬虫项目,首先我们先要知道哪个网站能获取到免费代理IP,目前比较火的有西刺代理,快代理等,这里我们拿西刺代理作为例子。 这里就是一个个免费的IP地址以及各自...

NateHuang
今天
3
0
11-利用思维导图梳理JavaSE-Java的反射机制

11-利用思维导图梳理JavaSE-Java的反射机制 主要内容 1.反射与Class类 1.1.反射概念 1.2.Class类 1.3.实例化Class类 1.4.反射的作用 1.5.Class对象的作用 2.反射的深入应用 2.1.调用无参的成...

飞鱼说编程
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部