首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

协变、逆变与不变

型变 型变(variance)是类型系统里的概念,包括协变(covariance)、逆变(contravariance)和不变(invariance)。...在 Scala 中在类型参数前添加 + 代表参数化类型在该类型参数上协变,添加 - 则代表逆变,什么都不加就是不变。...[Student] doesn't conform to expected type Array[Person] val persons: Array[Person] = students 那么,怎样集合类型才是协变的呢...考虑刚刚的数组的例子,将 Student[] 类型的实例赋值给 Person[] 类型的对象是没错的,当我们去修改 Person[] 对象的元素时,错误才产生。也就是说,不可变的集合才是协变的。...但由于已经知道了其元素类型是 Person 的「某个」子类,所以可以将其元素当作 Person 类型的对象取出。这就保证了协变集合的要求。

1.9K30

认真CS☀️协变、逆变 & 不变

) “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。...“协变”->”和谐的变”->”很自然的变化”->string->object :协变 协变在委托声明中加入out关键字,表示派生类只是用来输出值,避免出现由delegate派生类是平级,它们定义的变量无法相互赋值产生的问题...协变(out)是将派生类对象的引用传入到基类对象,输出派生类的值 逆变(in)是将基类对象的引用传入到派生对象,派生对象只能操作基类部分 接口的协变和逆变 1️⃣ 接口的协变 using System...DoSomething(father); } } 3️⃣ 协变和逆变的隐式强制转换 编译器自动识别某个已构建的委托是协变或是逆变并且自动进行强制转换 using System;...这些类型参数不能用于协变或逆变 delegate T Factory(); // 协变 逆变 不变 大家还有什么问题,欢迎在下方留言

10210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c#4.0中的不变(invariant)、协变(covariant)、逆变(contravariant)小记

    不变/协变/逆变,4.0中的这几个概念越念越象绕口令,如果单纯死记硬背,就算记住了,时间长了还是会忘记的。...园子里已经有不少高手撰文写过这个话题:比如“装配脑袋”的NET 4.0中的泛型协变和反变 (2008年他就已经搞明白了这个概念)、偶像Artech的“C# 4.0新特性-"协变"与"逆变"以及背后的编程思想...” 以及1-2-3的 协变(Covariance)和逆变(Contravariance)的十万个为什么 这里只是从应用的角度,简单记录一下: 从.net3.5开始,System命名空间里就定义了一个泛型委托...不会有任何问题,所以说fn1中的参数类型与fn2中的参数类型是安全兼容的,但是编译回不允许),这种不允许泛型参数类型变化的特点,称为不变性(invariant)....记忆方法:向上转型称协变(因为这种转型肯定是安全的,比较“和谐”),向下转型称逆变(因为不一定能转型成功,有出错的可能,称逆变) 最后:in,out这二个关键字不仅能用于泛型委托,同样也适用于泛型接口(

    863100

    不变(Invariant), 协变(Covarinat), 逆变(Contravariant) : 一个程序猿进化的故事

    阿袁工作的第1天: 不变(Invariant), 协变(Covarinat), 逆变(Contravariant)的初次约 阿袁,早!开始工作吧。...C#的逆变,协变语法。...阿袁工作的第5天:协变、逆变的一个真正用途。 昨天的简洁方案,让阿袁认识到了自己还没有明白协变、逆变的真正用途。 它们到底有什么用呢?难道只是编译器自己玩的把戏吗?...:了解协变和逆变的语法 Scala: +T : class的协变 Scala: -T :class的逆变 Scala: T 的协变 Scala: T >: S : function...的逆变 C#: out :协变 C#: in : 逆变 Level 3:理解协变和逆变发生的场景和用例 调用者对输入参数的协变用例 调用者对输出参数的逆变用例 调用者只有一个不平配的比较函数用例 //

    2.3K50

    代码的变与不变

    哲学上说变与不变,讲的是绝对运动与相对静止的道理,在代码设计中,也有许多变和不变之间的辩证故事。...当我们享受到代码变化带来的愉悦,也开始追求不变的代码,那一份古朴和单纯。 不变,引伸出对象复用的好处来。...无状态的单例,很多场景下可以看作简单的工具类;更多的对象在一定时期内无状态,比如 Prototype 模式,比如线程池、缓存,这些都将哲学中的变与不变最终结合到代码中去。...不变,是快速的、简单的、敏捷的,将变化的状态连结起来了。 程序=算法+数据,算法是不变的,数据是可变的。仿佛从软件的一开始,变与不变就给后续的万事万物埋下了伏笔,代码的世界围着这个特殊的视角旋转。...Action 是具备状态的,线程独立的;Service 和 DAO 是无状态的,是可以被池化的。不变得再极致一点,我希望从编译之后它就是不变的,而不是对象创建之后不变,这就是方法。

    54110

    Swift 之类型的协变与逆变

    —沃茨•其索特 1 什么是协变与逆变 刚开始看到协变(Covariance)和逆变(Contravariance)的时候,差点晕菜,反复查了一些资料,才稍有些自己的体会,难免有理解不对的地方,欢迎指出...相对于原始类型,这两种复杂类型之间的关系只能是不变(invariance),协变(covariance)和逆变(contravariance)之中的某一种。...List 是和它的原来类型协变(共同变化)的。...不变:如果说List 既不是 List的subtype,也不是supertype,也就是说没有关系,则说是不变的。 2 为什么要了解协变与逆变?...对于属性来说,如果是 readonly 的,属性是协变的,子类如果要覆盖,必须是父类属性的 subtype。如果是 readwrite 的,属性是不变的,子类必须和父类的属性类型完全一致。

    92620

    Java泛型的协变和逆变

    背景 文接上回,说到过Java的泛型擦除问题,这块我又联想到一个有意思的考点泛型的协变和逆变。...一、协变 首先Java的数组是协变的,所以假设A是B的父类,那么A[]是可以保存A或者B的对象的,并且A[]是B[]的父类。 ,写谁都会写,子类型限定。...逆变同样也是在各类源码中层出不穷,结合协变的理解,这块相信大家应该不难理解。 常见的例子比如,List的继承关系, 假设存在继承关系Object-》T、T-》A、T-》B; 即T为A、B的父类,协变面向子类;逆变面向Object,它是所有对象的父类。...小结 1、协变、逆变的区别要分清 2、另外,再提一点泛型和通配符的区别,当然也可以结合第一点理解, 用于定义泛型类和方法,擦除后为AAA类型; <?

    72600

    了解C#的协变和逆变

    前言 在引用类型系统时,协变、逆变和不变性具有如下定义。 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类。...以上来自于官方文档对协变、逆变、不变性的解释 为啥C#需要协变和逆变?...在C#中,目前只有泛型接口和泛型委托可以支持协变和逆变, 协变(Covariance) 内置的泛型协变接口,IEnumerator、IQuerable、IGrouping的输入参数 当要进行类型转换,占位符T要转换的目标类型也必须是其子类,上述例子则是FooBase转为Foo 总结 协变和逆变只对泛型委托和泛型接口有效,对普通的泛型类和泛型方法无效 协变和逆变的类型必须是引用类型...,因为值类型不具备继承性,因此类型转换存在不兼容性 泛型接口和泛型委托可同时存在协变和逆变的类型参数,即占位符T 参考 泛型中的协变和逆变 | Microsoft Docs 《你必须知道的.NET(第2

    94810

    【Kotlin】泛型 ③ ( 泛型 out 协变 | 泛型 in 逆变 | 泛型 invariant 不变 | 泛型逆变协变代码示例 | 使用 reified 关键字检查泛型参数类型 )

    文章目录 一、泛型 out 协变 二、泛型 in 逆变 三、泛型 invariant 不变 四、泛型逆变协变代码示例 五、使用 reified 关键字检查泛型参数类型 本章总结 : 使用了 泛型 out...协变 和 泛型 in 逆变 极大的提高了程序的扩展性 ; 泛型 in 逆变 : 使用 in 关键字 , 可以使 父类泛型对象 赋值给 子类泛型对象 ; 泛型 out 协变 : 使用 out 关键字 ,...Consumer { fun consume(t: T) } 三、泛型 invariant 不变 ---- 在 泛型类 中 , 如果 既将 泛型类型 作为 函数的参数 类型 , 又将...又用于作为参数 ; interface ProducerOrConsumer { fun produce(): T fun consume(t: T) } 四、泛型逆变协变代码示例...) 如果 使用 out 关键字 , 则 范围小的子类泛型对象 赋值给 范围大的 父类泛型对象 ; ( 反之就会报错 ) 使用了 泛型 out 协变 和 泛型 in 逆变 极大的提高了程序的扩展性

    1.7K10

    c# 协变和逆变的理解

    是什么 1.1 协变 协变指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。如 string 到 object 的转换。多见于类型参数用作方法的返回值。...泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性。 2....其实很好理解,子类必然具有相同或更多的属性和方法,所以转换成属性和方法可能更少的父类,只需要去除自身的部分属性和方法即可,这对编译器而言是可行的。反之,你怎么要求编译器为父类增加更多的成员呢。...也正是因此,为了防止开发者写出错误的代码,.net 设计者便用了协变和逆变(对应 out 和 in 关键字)来强制要求正确行为。...所以归根到底,协变和逆变只是一种约束而已,这种规范限制了你的泛型接口中要么只能有将类型参数当作返回值的协变相容方法(加了 out 关键字),要么只能有将类型参数当作输入值的逆变相容方法(加了 in 关键字

    1.5K60

    哲思片段 | 设计中的变与不变

    无论它在内存中存储的状态如何变化,该实例的对象标识依旧是保持不变的。显然,变与不变是相对的。 切换到DDD的命题中,所谓“实体”就是那种具有唯一的可识别可跟踪ID的对象。...这个ID并非程序语言在内存中为它分配的对象标识,而是从领域角度来看,由设计者为其识别,由创建者为其分配,因而具有领域语义。实体的状态当然是可变的,然而实体ID在这个实体的生命周期中却是不可变的。...这种不变意味着只要它存在,就不可修改,而且恒古不变。这种追究变化背后的不变性,一直是古希腊哲学乃至科学的基本原则。...物质是否永恒不变,在哲学中一直是引人深思的命题或假设;但在函数式编程中,它几乎被证明了。...这是赫拉克利特终极的哲学观,即万物随时在变。软件系统就是这样一条河流,它无时无刻不在变化,正如水不断的流动,需求也总是在变化。

    1.3K70

    前端之变(一):技术的变与不变

    这是第一篇:技术的变与不变 变与不变 首先,做为一个技术人员,你要明白一个道理: 对技术而言:唯一不变的事情就是变化 所以,想要成为一个优秀的程序员,你不能期望只精通一门语言或几种框架类库,就能成为你永恒的资本...当然,在他们的思维中,这个肯定不是『技术』 但显然这是缪论。 因为这些人没有意识到技术在变的过程中,存在着『不变』的东西。...一旦你掌握及理解了不变的东西,所谓的变化对你而言,可能就如同换肤一样轻易与简单。 这也是为什么国外很多优秀的程序员一把年纪了还是在技术第一线。...为什么别人能做到的事,在我们这片土地上,我们做不到?这是非常我们反思与思考的一个现象。 我在2020年与前端的一些交集,让我意识到了技术的这种变与不变。对我而言,仿佛这是一个全新的世界。...前端可以应用基本的面向对象的原则及设计模式了 所以,看到没,如果把范围放大,你说它改变了么? 道与术 这就是我在2020年的感悟到的一个最大的事情 ,技术这个东西原来存在变与不变两方面的东西的。

    40220

    Java泛型的协变和逆变

    背景 文接上回,说到过Java的泛型擦除问题,这块我又联想到一个有意思的考点泛型的协变和逆变。...一、协变 首先Java的数组是协变的,所以假设A是B的父类,那么A[]是可以保存A或者B的对象的,并且A[]是B[]的父类。 ,写谁都会写,子类型限定。...逆变同样也是在各类源码中层出不穷,结合协变的理解,这块相信大家应该不难理解。 常见的例子比如,List的继承关系, 假设存在继承关系Object-》T、T-》A、T-》B; 即T为A、B的父类,协变面向子类;逆变面向Object,它是所有对象的父类。...小结 1、协变、逆变的区别要分清。 2、另外,再提一点泛型和通配符的区别,当然也可以结合第一点理解, 用于定义泛型类和方法,擦除后为AAA类型; <?

    54350

    李彦宏的万变和不变

    以四大入口的变化,履行不变的使命   在“变化”上,2013年给外界留下最深刻印象的,是百度。百度是PC这个岸上的“入口”,现在,它正在过河:传统产业互联网化的大河、移动大河。...面对日新月异的科技浪潮,李彦宏说自己的手段和技术会不断变革,而百度的使命,也是他的使命,则永远不会变。   ...在BAT三巨头中, 使命不变的似乎只有百度,虽然,看上去2013年的百度与过去并不一样,但实际上依然是围绕着“让人们最平等便捷地获取信息,找到所求”。...不变的是百度的内核:始终站在流量和应用的入口,俯视整个产业,为产业链上的每个利益者输送源源不断的流量和平台支持,同时,其自身消化流量的能力也进一步上升,最终为百度的使命服务。   ...现在,百度移动拥有的14个用户过亿的石头,只是给了百度一种安全感,能否顺利渡河,还得看这条河有多宽,水有多深,甚至,运气。   世界在变,产业环境在变,用户需求在变,游戏规则在变,对手也在变。

    58190

    C# | 泛型委托的协变与逆变

    协变 协变: 当类型参数仅用作输出(即返回值)时,可将类型参数标记为 out 这样就允许 Del dogMaker = MakeDog; // MakeDog是一个返回Dog匹配委托的方法...Console.WriteLine(animal().Leg.ToString()); Del 指向了 Del 调用代码 animal() 期望返回 Animal , 而其指向的...Del 返回了 Dog , Dog 是 Animal 的派生类,接受返回 Dog ,于是可以,调用代码可以自由的操作返回的对象的 Animal 部分 逆变 逆变: 当类型参数仅用作输入(作为方法的参数类型...Dog ,于是又传入了其指向了 Del , 于是传入 Del 了一个Animal的派生类Dog 这种在期望传入基类 时允许传入派生对象 的特性叫做逆变...本文作者: yiyun 本文链接: https://moeci.com/posts/2022/01/CSharp-泛型委托的协变与逆变/ 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA

    63920

    2016大数据行业的变与不变

    不仅是计算机领域的科学家,数学等其他领域的科学家也将参与到大数据的前沿研究中。 大数据的安全和隐私也受到了持续关注。...对大数据的威胁和对大数据所产生的副作用,以及大数据发展中的障碍会逐渐成为大数据领域的关注点。...潘柱延指出:“除了学术、技术、商业的推动外,政策的扶持会产生很大作用,大数据相关的基础设施建设和大数据创业公司在双创政策的推动下,两个驱动力会快速带动大数据的发展。”...谈到人才和技术的生态方向,CCF大数据专家组预测,开源将持续成为大数据发展的主导性的技术方向和技术平台,测评则会以良币驱逐劣币的方式引导优秀的大数据技术发展,而各种各样的创业创新大赛也会成为人才和技术生态完善的一个重要标准和驱动力...政策性是大数据发展的重要指标,不可否认,大数据本身具有概念性,有泡沫存在,但是不能因为啤酒上有泡沫而放弃底下香浓的啤酒。”他强调。 内容来源:中国科学报

    793120

    Python对象的深浅拷贝,你到底变不变

    ,就是l1变了,l2变不变的问题 我这里在使用的嵌套列表 l1 = [[1, 2], (30, 40)] l2 = list(l1) l2 [[1, 2], (30, 40)] l1.append(...首先初始化一个列表l1,里面的元素是一个列表和元组,然后对l1执行浅拷贝,赋予了l2 ,但是l2中的元素和l1指向同一个列表和元组对象,只有列表对象变,你浅拷贝就要跟着我变。...如果你添加一个序列来,我浅拷贝没有指向你新来的对象。我干嘛跟着你变。 l1.append(100)l1的列表新增元素100,不会对l2产生影响,l1和l2是两个不同的对象 如果我在元组加呢???...l1[1] += (50, 60) l1 [[1, 2, 3], (30, 40, 50, 60), 100] l2 [[1, 2, 3], (30, 40)] 竟然不会变,说白了只有列表对象变,难道元组不可变你不知道...深度拷贝 深度拷贝,就是你爱怎么变,就去哪里变,我就不变了。

    38730

    长跑 11 年,腾讯开源的变与不变

    90年代,开源如一无所有的灰姑娘,仰望着海外梦幻般的舞会,自己却很难融入其中;而世纪初,国内开源得到了自己的水晶鞋,世界给予舞台,自当展现绝佳的舞蹈天赋,国内开源产业的发展苗头逐渐加快;如今,灰姑娘已经得到了王子的青睐...PART ONE 开源多元化,国产开源的变局与发展 开源是软件产业的一大创举,也是软件理念的一大发展。以往的硬件时代,所有产品都是一种资源,用则少,不用则不变。...,这一阶段开发者会更多的在开源社区进行编程,不仅仅在打造一款产品,也是在以工作之外的技术身份进行自我技术的提升;第三阶段会让开发者的内心获得更多的自豪,在开源社区得到更多荣誉,在解决问题之外还能达到自我价值的实现...腾讯的开源有着诸多的推进方式,去年TARS的开源便是一次成功的尝试。...而腾讯是一个长跑型公司,在很多项目的开源之初很难预期其未来的发展方向,更多的是在考虑技术能否支撑起某一领域的业务未来的发展,而其发展的高度最终依然取决于业务和技术本身突破。

    43930
    领券