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

打字中协变与逆变位置的区别

打字中的协变和逆变位置是指在类型系统中,参数类型或返回类型在子类型关系中的变化方式。

协变(Covariant)是指类型参数在子类型关系中保持不变或者向更具体的类型变化。在协变位置,可以将子类型的对象赋值给父类型的对象,而不会引发类型错误。在打字中,协变位置通常出现在返回类型或者只读属性的类型中。

逆变(Contravariant)是指类型参数在子类型关系中相反地变化。在逆变位置,可以将父类型的对象赋值给子类型的对象,而不会引发类型错误。在打字中,逆变位置通常出现在参数类型中。

区别:

  1. 协变位置和逆变位置的变化方向相反。协变位置中,类型参数变化的方向是向更具体的类型,而逆变位置中,类型参数变化的方向是向更抽象的类型。
  2. 协变位置中的类型参数可以被赋值为其子类型,而逆变位置中的类型参数可以被赋值为其父类型。
  3. 协变位置通常出现在返回类型或只读属性的类型中,而逆变位置通常出现在参数类型中。

在实际应用中,协变和逆变可以提供更灵活的类型系统,使得代码更加可复用和可扩展。在面向对象编程中,协变和逆变可以通过接口或抽象类的继承关系来实现。在函数式编程中,协变和逆变可以通过函数类型的定义和组合来实现。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送、移动分析):https://cloud.tencent.com/product/mps
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙:https://cloud.tencent.com/solution/elemental-universe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

不变

如果 T[A] 是 T[B] 子类,则这种关系是「」,因为参数化类型 T 父子类关系类型参数父子类关系是「相反方向」。...在 Scala 在类型参数前添加 + 代表参数化类型在该类型参数上,添加 - 则代表,什么都不加就是不变。...在 Java ,类似于也是在应用时候才去对其进行约束,例如: List persons = new ArrayList(); List<?...语义情况是类似的。 于是,Scala 和 Java 标记可以进行如下总结 3: Scala Java 解释 +T ?...在 Scala ,如果进行了或者标记,编译器就会对这个类型参数使用进行检查,如果它出现在了错误位置上,编译器就会提示错误,防止了开发者因此而犯错。

1.9K30

TypeScript 和双向

通过原则 (covariance and contravariance)是在计算机科学,描述具有父/子型别关系多个型别通过型别构造器、构造出多个复杂型别之间是否有父/子型别关系用语...维基百科上关于解释有点晦涩难懂。...但在TS,参数类型是双向(详见下文3.1小节),如果项目里开启了"strict": true,意味着,会来带开启 strictFunctionType ,此时,才按照处理 双向 在老版本...TS ,函数参数是双向。...也就是说,既可以又可以,但是这并不是类型安全。在新版本 TS (2.6+) ,你可以通过开启 strictFunctionTypes 或 strict 来修复这个问题。

1.1K20
  • Java泛型

    导读 泛型是Java最基础语法之一,众所周知:出于安全原因,泛型默认不能支持型(否则会引入危险),因此Java提供了通配符上限和通配符下限来支持型,其中通配符上限就泛型,通配符下限就是泛型...因此对于泛型集合,程序只能从集合取出元素——取出元素类型肯定能保证是上限;但程序不能向集合添加元素——因此程序无法确定程序要求集合元素具体是上限哪个子类。...extends Number>是支持泛型,因此程序两行①号代码可以分别将List、List赋值给List类型变量。...因此对于泛型集合,程序只能向集合添加元素——添加元素类型总能符合上限——而集合元素总是上限父类,因此完全没问题;但程序不能从集合取出元素——因为编译器无法确定集合元素具体是下限哪个父类—...但如果程序尝试从泛型集合取出元素,那么取出元素只能被当成Object处理(众生皆Object)。

    1.3K40

    ”、“Delegate类型转换

    之后又想到了其他一些相关东西,除了简单地分析如何通过Emit实现EventHandler类型转换之外,还加上关于Delegate“一些东西,算是对前一篇文章完善。...目录 一、从Delegate”说起 二、EventHandler是否换一种定义方式更好?...四、通过Emit实现EventHandler类型转换 五、最简单转换方式 一、从Delegate”说起 根据Delegate“原理,对于两个具有相同声明两个...我们在定义泛型Delegate时候可以利用C#“”,使类型为A对象能够赋值给类型为B变量。...如果事件类型对于得Delegate并没有采用方式定义,那么要求我们注册一个之类型完全一致Delegate。

    85170

    Swift 之类型

    —沃茨•其索特 1 什么是 刚开始看到(Covariance)和(Contravariance)时候,差点晕菜,反复查了一些资料,才稍有些自己体会,难免有理解不对地方,欢迎指出...那么我们就可以这么来解释变了: : 如果说 List 也是 Listsubtype,也就是衍生类型关系和原来类型( Cat Animal)关系是一致,那我们就说...不变:如果说List 既不是 Listsubtype,也不是supertype,也就是说没有关系,则说是不变。 2 为什么要了解?...() -> Cat 和 () -> Animal 关系 Cat 和 Animal 之间关系一致,也就是说是在 Swift 函数返回值是。...其他类型 上面我们提到了函数参数和返回值分别是和协,在 Swift 除了函数,还有属性(property),范型(Generic)等。

    90320

    C#进阶-

    我们知道子类转换到父类,在C#是能够隐式转换。这种子类到父类转换就是。而另外一种类似于父类转向子类变换,可以简单理解为。...可以用于泛型委托和泛型接口,本篇文章我们将讲解C#里和协使用。和协语法第一次接触难免感到陌生,最好学习方式就是在项目中多去使用,相信会有很多感悟。... (共):泛型委托或泛型接口类似于父类转向子类变换; (反):泛型委托或泛型接口类似子类到父类隐式转换; 用来描述类型转换后继承关系,其定义:如果A、B表示类型...令List成为List子类变化,我们叫做,和stringObject父子关系是相同;反之,令List成为List子类变化,我们叫做...,和stringObject父子关系是相反能够实现数组类型、委托类型和泛型类型参数隐式引用转换。

    12221

    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

    63520

    Java泛型

    背景 文接上回,说到过Java泛型擦除问题,这块我又联想到一个有意思考点泛型。...相信大家也都见到过JDK很多源码也有这么用,但为什么要这么写呢? 根因是Java泛型没有类型,无法关联起来,也就没有关系。 利用通配符,?代表子类,T为父类。...同样也是在各类源码中层出不穷,结合理解,这块相信大家应该不难理解。 常见例子比如,List<?...理解它,也可以通过Java继承关系, 假设存在继承关系Object-》T、T-》A、T-》B; 即T为A、B父类,面向子类;面向Object,它是所有对象父类。...小结 1、区别要分清 2、另外,再提一点泛型和通配符区别,当然也可以结合第一点理解, 用于定义泛型类和方法,擦除后为AAA类型; <?

    68400

    了解C#

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

    93410

    c# 理解

    泛型类型参数支持,可在分配和使用泛型类型方面提供更大灵活性。 2....数组也继承了这一特性,对于一个string[]类型而言 理解了上述概念后,让我们来看看概念,这里我们只谈谈关于接口可变性一些内容。以下我简单给出一个接口及其实现。...但是当我们将上述代码子类和父类位置调换,换成上述注释代码,编译器则会报错。...也正是因此,为了防止开发者写出错误代码,.net 设计者便用了(对应 out 和 in 关键字)来强制要求正确行为。...所以归根到底,只是一种约束而已,这种规范限制了你泛型接口中要么只能有将类型参数当作返回值变相容方法(加了 out 关键字),要么只能有将类型参数当作输入值变相容方法(加了 in 关键字

    1.5K60

    Java泛型

    背景 文接上回,说到过Java泛型擦除问题,这块我又联想到一个有意思考点泛型。...相信大家也都见到过JDK很多源码也有这么用,但为什么要这么写呢? 根因是Java泛型没有类型,无法关联起来,也就没有关系。 利用通配符,?代表子类,T为父类。...同样也是在各类源码中层出不穷,结合理解,这块相信大家应该不难理解。 常见例子比如,List<?...理解它,也可以通过Java继承关系, 假设存在继承关系Object-》T、T-》A、T-》B; 即T为A、B父类,面向子类;面向Object,它是所有对象父类。...小结 1、区别要分清。 2、另外,再提一点泛型和通配符区别,当然也可以结合第一点理解, 用于定义泛型类和方法,擦除后为AAA类型; <?

    53950

    c#4.0不变(invariant)、(covariant)、(contravariant)小记

    不变//,4.0这几个概念越念越象绕口令,如果单纯死记硬背,就算记住了,时间长了还是会忘记。...园子里已经有不少高手撰文写过这个话题:比如“装配脑袋”NET 4.0泛型和反 (2008年他就已经搞明白了这个概念)、偶像Artech“C# 4.0新特性-""""以及背后编程思想...” 以及1-2-3 (Covariance)和(Contravariance)十万个为什么 这里只是从应用角度,简单记录一下: 从.net3.5开始,System命名空间里就定义了一个泛型委托...(儿子是人类,父母当然也是人类,不可能是畜生,呵) 这时,我们称T为(ContraVariant)量,而TResult则为(CoVariant)量。...记忆方法:向上转型称(因为这种转型肯定是安全,比较“和谐”),向下转型称(因为不一定能转型成功,有出错可能,称) 最后:in,out这二个关键字不仅能用于泛型委托,同样也适用于泛型接口(

    842100

    Java基础知识:泛型类型擦除、

    通过,可以让泛型约束变得更加宽松。 不同,放宽是对父类约束,而放宽是对子类约束。 但同样,放宽类型约束是存在一定代价: List list = new ArrayList(); list.get(0); //无法进行get 使用场景: 当一个对象只作为泛型生产者,也就是只取泛型情况下...extends ; 例如 JDK ArrayList 集合构造法中就是使用了: public ArrayList(@NotNull @Flow(sourcelsContainer = true...super ; 例如 JDK ArrayList removeIf 方法就是使用了: public boolean removeIf(Predicate<?...super ; 例如 JDK ArrayList removeIf 方法就是使用了: public boolean removeIf(Predicate<?

    74530

    C#泛型之个人理解

    object> list = new List(); 这个为什么就可以 A:   这就要讲到C#泛型里变了 Q:   细嗦细嗦 C#泛型(in)(out)对于不常自定义泛型开发来说..., 变相似, 需要在泛型 T 之前加上关键词 in 对比上方, 看起来就像是将基类赋值给子类, 但这其实符合里氏代换 当我们调用 item.Print 时, 看起来允许传入参数为 string..., 帮助开发者更好地复用代码, 同时通过约束限制可能会出现破坏类型安全操作 限制 虽然上面讲了(in)(out)看起来是什么样, 但我那个朋友还是有些疑问 Q:   那我什么时候可以用...A:   假设 IEnumerable 同时支持, IEnumerable list = new List();进行赋值后, list实际保存类型是string...两者限制简单总结就是 输入 输出

    19120

    C# 4.0新特性-以及背后编程思想

    在《上篇》我们揭示了“缺省参数”本质,现在我们接着来谈谈C#4.0另一个重要新特性:(Covariance)(Contravariance)。...对于,大家肯定不会感到陌生,但是我相信有很多人不能很清晰地说出他们之间区别。我希望通过这篇文章能够让读者更加深刻认识。...目录 一、两个概念:强类型弱类型 二、委托使用 三、接口中使用 四、从Func...二、委托使用 主要体现在两个地方:接口和委托,先来看看在委托如何使用。...接下来我们来谈谈本质区别是什么。

    62980

    C#4.0新增功能03 泛型

    泛型类型参数支持,可在分配和使用泛型类型方面提供更大灵活性。 在引用类型系统时,和不变性具有如下定义。...对于接口,类型参数可用作接口方法返回类型,而类型参数可用作接口方法参数类型。 统称为“变体” 。 未标记为泛型类型参数称为“固定参数” 。...泛型委托类型参数协方差和效果类似于普通委托绑定协方差和效果(请参阅委托差异 (C#) 和委托差异 (Visual Basic))。...Visual Basic 和 C# 不允许违反类型参数使用规则,也不允许将批注添加到接口和委托类型之外类型参数。...Variant 泛型接口和委托类型列表 在 .NET Framework 4 ,下面的接口和委托类型具有和/或类型参数。

    1.3K20

    五分钟看完,彻底理解C#

    解决问题 泛型类型转换 比如Person类是Student父类,我们平时可以直接: Person A = new Student(); 这是所谓隐式转换,相信百分之999.99%的人都知道...这种从派生类转向基类兼容,就是所谓。 说白了,我可以造个学生,结果你说给个人就行, 那不是so easy。...最后我们总结下,和协就是让方法有了泛型类型上转换能力,强化了方法多态能力。 问题点 1、属性为啥可以用? 属性不就是get/set方法。...2、为什么接口和委托可以用,类不行? 拜托你找一下共同点,接口和委托共同点,都是行为,也就是方法为核心。接口里不能有字段。这也印证了我说最终是为方法服务。...3、和协有啥用? 当你...设计问题,我就有遇到,有时候用上能更加优雅或者灵活写代码吧,看你吧,少年。

    26320

    深入 TypeScript 子类型、,进阶 Vue3 源码前必须搞懂

    和协 先来段维基百科定义: (covariance and contravariance)是在计算机科学,描述具有父/子型别关系多个型别通过型别构造器、构造出多个复杂型别之间是否有父...(Covariance) 那么想象一下,现在我们分别有这两个子类型数组,他们之间父子关系应该是怎么样呢?...在 TS 当然,在 TypeScript ,由于灵活性等权衡,对于函数参数默认处理是 双向 。...在开启了 tsconfig strictFunctionType 后才会严格按照 来约束赋值关系。...结语 这篇文章结合我自己最近学习类型相关知识一些心得整理而成,如果有错误或者疏漏欢迎大家指出。 参考资料 Subsets & Subtypes TypeScript 官方文档 维基百科-

    1.2K31

    哲思片段 | 设计不变

    无论它在内存存储状态如何变化,该实例对象标识依旧是保持不变。显然,不变是相对。 切换到DDD命题中,所谓“实体”就是那种具有唯一可识别可跟踪ID对象。...之相对是值对象。在DDD,强调将领域对象严格区分为实体和值对象。一个指导原则是,当你无法分辨某个领域对象究竟是实体还是值对象时,应优先将其建模为值对象。这有助于我们更好地利用值对象不可变性。...这是赫拉克利特终极哲学观,即万物随时在。软件系统就是这样一条河流,它无时无刻不在变化,正如水不断流动,需求也总是在变化。...这个Identity表达了单一、恒等概念,例如Int类型中加减法运算半群(SemiGroup)Zero,就是一个Identity,因为半群任何元素aZero结合,依然是元素a本身。...水是如何组成一条河流呢?这取决于组合子(Combinator)设计组合。只要我们找到万物基本要素,继而设计出各种组合子,就可以演绎出世间不同物。

    1.3K70
    领券