文档章节

为什么需要协变 逆变

jinlei_du
 jinlei_du
发布于 2017/02/24 17:14
字数 421
阅读 0
收藏 0
点赞 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
闵行
程序员
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 ⋅ 0

C# 4.0新特性-"协变"与"逆变"以及背后的编程思想

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

长平狐 ⋅ 2012/09/04 ⋅ 0

协变和逆变(转载)

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

jeffcky ⋅ 2015/08/15 ⋅ 0

Scala的协变covariant(+),逆变contravariant(-),上界(:)

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

u013063153 ⋅ 2017/11/09 ⋅ 0

Scala的协变(+),逆变(-),上界(:)

Scala的协变(+),逆变(-),上界(<:),下界(>:) 协变covariant、逆变contravariant、不可变invariant 对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合List[...

秋风醉了 ⋅ 2015/08/02 ⋅ 0

谈谈.Net中的协变和逆变

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

长平狐 ⋅ 2012/06/08 ⋅ 0

深入理解 C# 协变和逆变

msdn 解释如下: “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。 “逆变”则是指能够使用派生程度更小的类型。 解释的很正确,大致就是这样,不过不够直白。 直白的理...

bxc ⋅ 2012/03/13 ⋅ 0

Scala之类型参数化:Type Parameterization

Scala之类型参数化:Type Parameterization 本文原文出处: http://blog.csdn.net/bluishglc/article/details/52584401 严禁任何形式的转载,否则将委托CSDN官方维护权益! 型变:Variance 型...

bluishglc ⋅ 2016/09/19 ⋅ 0

一句话清晰总结协变和逆变

看到过园子里面几篇协变和逆变的文章,但是总觉得写得不够清晰,文章这东西注重要是要把自己想表达的观点表达出来,这个过程应该是把复杂的东西消化出来从而简单化,清晰化,而不是故弄玄虚,...

长平狐 ⋅ 2012/06/08 ⋅ 0

scala-协变、逆变、上界、下界

测试源代码 欢迎大家关注: scala工具库 ,里面包含各种库的测试用例和使用说明文档 B是A的子类,A是B的父类。 当我们定义一个协变类型List[A+]时,List[Child]可以是List[Parent]的子类型。 ...

jacksu ⋅ 2015/11/20 ⋅ 5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

懒惰根本就不存在

简评:芝加哥大学心理学教授,懒惰根本就不存在。(本文表面讲行为心理学实则讲教育) 金句:以好奇而不是判断来回应一个人的无效行为,是非常有帮助的。 本文「我」代表原作者 E Price。 自...

极光推送 ⋅ 30分钟前 ⋅ 0

Excel提取单元格中最后一个“.”后面的数据

java.lang.String ----- String =TRIM((MID(SUBSTITUTE(B2,".",REPT(" ",99)),(LEN(B2)-LEN(SUBSTITUTE(B2,".","")))*99,99)))...

klog ⋅ 32分钟前 ⋅ 0

mac远程桌面

下载安装remote-desktop-mac Mac beta 客户端 mac通过远程桌面访问windows服务器。

亚林瓜子 ⋅ 37分钟前 ⋅ 0

firrtl

动手---sbt(2)之后,再回头看 chisel第一个实验,根据 https://github.com/freechipsproject/firrtl 发现firrtl没有执行sbt assembly命令,重新执行这个命令,结果成功。如下图: joe@joe-As...

whoisliang ⋅ 41分钟前 ⋅ 0

NIO

一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。 二、通道的主要实现类 java.nio.channel...

stars永恒 ⋅ 41分钟前 ⋅ 0

Android悬浮窗的实现

0. 前言   现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示。这个功能在很多情况下都非常有用。那么今天我们就来实现一下Android悬浮窗,以...

猴亮屏 ⋅ 41分钟前 ⋅ 0

日志采集中的关键技术分析

概述 日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此...

tqyin ⋅ 43分钟前 ⋅ 0

使用Navicat将数据导出为text文本 然后再导入

将数据导出为text文本效率很高 1. 准备工作 1.1 准备表结构 1.2 目标库 执行生成表结构sql 2.将表数据导出为text文本 生成的text文本 3. 目标库 导入text 4.效果...

Lucky_Me ⋅ 49分钟前 ⋅ 0

IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

文章介绍了idea下,项目乱码、控制台乱码及运行tomcat控制台乱码的解决方案,文章链接:https://www.cnblogs.com/vhua/p/idea_1.html

Funcy1122 ⋅ 52分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 56分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部