—沃茨•其索特 1 什么是协变与逆变 刚开始看到协变(Covariance)和逆变(Contravariance)的时候,差点晕菜,反复查了一些资料,才稍有些自己的体会,难免有理解不对的地方,欢迎指出 相对于原始类型,这两种复杂类型之间的关系只能是不变(invariance),协变(covariance)和逆变(contravariance)之中的某一种。 Reference Swift 2.1 Function Types Conversion: Covariance and Contravariance Friday Q&A 2015-11-20: Covariance and Contravariance
前言 TypeScript 中有很多地方涉及到子类型 subtype、父类型 supertype、逆变和协变covariance and contravariance的概念,如果搞不清这些概念,那么很可能被报错搞的无从下手 逆变和协变 先来段维基百科的定义: 协变与逆变(covariance and contravariance)是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父 逆变(Contravariance) 有这样两个函数: let visitAnimal = (animal: Animal) => void; let visitDog = (dog: Dog) => 在对 Animal 和 Dog 类型分别调用如下的类型构造器之后: type MakeFunction = (arg: T) => void 复制代码 父子类型关系逆转了,这就是 逆变(Contravariance
Contravariance 使你能够使用比原始指定的类型更泛型(派生程度更小)的类型。 你可以将 Action 的实例分配给 Action 类型的变量。 关键子标识,并且占位符T只能用于只读属性、方法或者委托的返回值,out简而易懂,就是输出的意思 当要进行类型转换,占位符T要转换的目标类型也必须是其基类,上述例子则是Foo隐式转为FooBase 逆变(Contravariance
Nonnull [_Nullable])keys count:(NSUInteger)cnt NS_DESIGNATED_INITIALIZER; 参考: iOS 强大的泛型 Covariance and contravariance (computer science) 2015 Objective-C 新特性 Covariance, Contravariance以及Generics在 Swift/OC 中的应用.
委托可以接受比她的方法目标更具体的参数类型,这个叫ContraVariance 和泛型参类型一样,委托的Variance仅支持引用转换 delegate void StringAction(string Covariance,out; ContraVariance,in; delegate object ObjectRetriever(string s); class Demo { static
逆变(contravariance) 3.
通过协变和逆变原则 协变与逆变(covariance and contravariance)是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父/子型别关系的用语 why-are-functions-with-fewer-parameters-assignable-to-functions-that-take-more-parameters what are covariance and contravariance
,这里有篇介绍: 协变(covariance)和抗变(contravariance)是什么?[1] 协变和逆变维基上写的很复杂,但是总结起来原理其实就一个。 参考资料 [1] 协变(covariance)和抗变(contravariance)是什么? :https://www.stephanboyer.com/post/132/what-are-covariance-and-contravariance [2] How strict is Typescript
所谓逆变(Contravariance),是指能够使用比原始指定的类型派生程度更小的类型,简单理解就是 父类转为子类 这种变化. C# 中逆变对应的关键字为 in, 我们同样先来看个示例: // generics contravariance delegate public delegate void ContravarianceDelegate
abstract function test(string $s); } abstract class B extends A { // overridden - still maintaining contravariance
型变(Variance) Kotlin 中的型变分为协变(Covariance)和逆变(Contravariance)。协变允许子类型替换父类型,而逆变则相反。
变体(variance)是协变(convariance)和抗变(也说逆变contravariance)的统称。
LSP 对语言增加了新的签名约束(协变与逆变可以看这篇文章Java中的逆变与协变): Contravariance of method arguments in the subtype.
4.0中的泛型协变和反变 (2008年他就已经搞明白了这个概念)、偶像Artech的“C# 4.0新特性-"协变"与"逆变"以及背后的编程思想” 以及1-2-3的 协变(Covariance)和逆变(Contravariance
在《上篇》中我们揭示了“缺省参数”的本质,现在我们接着来谈谈C#4.0中另一个重要的新特性:协变(Covariance)与逆变(Contravariance)。 五、逆变实现了“算法”的重用 实际上关系协变和逆变体现出来的编程思想,还有一种我比较推崇的说法,那就是:协变是继承的体现,而逆变体现的则是多态(可以参考idior的文章《Covariance and Contravariance
变型分为三类:类型含义示例协变(Covariance)子类型关系被保留[]Cat→[]Animal(若允许)逆变(Contravariance)子类型关系被反转func(Animal)→func(Cat
Java 中的泛型泛型的型变(variance)协变(Covariance):子类泛型是父类泛型的子类型,可以把子类泛型赋值给父类泛型逆变(Contravariance):父类泛型(可以看作)是子类泛型的子类型 Animal 的子类):协变(Covariance):List<Dog> 是 List<Animal> 的子类型,List<Dog> 类型的对象可以赋值给 List<Animal> 类型的变量逆变(Contravariance 子类可以赋值给父类List.add()方法的参数类型是 T,new Animal() 得到的对象作为一个父类型的实参,不可以赋值给子类型的形参,因此编译失败// 逆变,只写不可读private void contravariance
Java 中的泛型泛型的型变(variance)协变(Covariance):子类泛型是父类泛型的子类型,可以把子类泛型赋值给父类泛型逆变(Contravariance):父类泛型(可以看作)是子类泛型的子类型 Animal 的子类):协变(Covariance):List<Dog> 是 List<Animal> 的子类型,List<Dog> 类型的对象可以赋值给 List<Animal> 类型的变量逆变(Contravariance 子类可以赋值给父类List.add()方法的参数类型是 T,new Animal() 得到的对象作为一个父类型的实参,不可以赋值给子类型的形参,因此编译失败// 逆变,只写不可读private void contravariance
: 0 } } 协变(Covariant)与逆变(Contravariance) 在Java中同样也有这两种类型变换。对于Java而言,也就是: 协变:List<?
型变 型变(variance)是类型系统里的概念,包括协变(covariance)、逆变(contravariance)和不变(invariance)。 参考资料 Covariance and contravariance (computer science) - Wikipedia ↩ The Origins of Scala ↩ Dean