using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyGeneric.CC { /// <summary> /// 逆变(contravariant)与协变(covariant):只能用在接口和委托上面 /// out “协变”->”和谐的变”->”很自然的变化”->strin…
我们知道子类转换到父类,在C#中是能够隐式转换的.这种子类到父类的转换就是协变. 而另外一种类似于父类转向子类的变换,可以简单的理解为“逆变”. 上面对逆变的简单理解有些牵强,因为协变和逆变只能针对接口和代理类型.而父类和子类之间不存在这种逆变的概念. 协变和逆变的本质都是子类安全的转到父类的过程. 下面就来加深下印象,先定义两个类Car和Baoma public class Car { } public class Baoma : Car { } 明显Baoma(宝马)是Car的子类 1,先来…
阿袁工作的第1天: 不变(Invariant), 协变(Covarinat), 逆变(Contravariant)的初次约 阿袁,早!开始工作吧. 阿袁在笔记上写下今天工作清单: 实现一个scala类ObjectHelper,带一个功能: 函数1:将一个对象转换成另一种类型的对象. 这个似乎是小菜一碟. 虽然不知道如何转换对象,那就定义一个函数参数,让外部把转换逻辑传进来.我真聪明啊! 这样,阿袁实现了第一个函数convert. class ObjectHelper[TInput, TOutpu…
1. 定义 逆变和协变描述的经过类型变换后的类型之间的关系.假如A和B表示类型,f表示类型变换,A ≤B表示A是B的子类型,那么 如果A ≤B,f(A) ≤f(B),那么f是协变 如果A ≤B,f(B) ≤f(A),那么f是逆变 如果两者都不是,那么f不变 这里的子类型并非是面向对象中继承关系中的子类型,它更多的是描述两个类型之间的兼容性. 2. 实例:泛型 考虑一个例子,假如f(A) = List<A>,且List声明如下: class List<T> { ... } 那么f是逆…
Scala中的协变,逆变,上界,下界等 目录 [−] Java中的协变和逆变 Scala的协变 Scala的逆变 下界lower bounds 上界upper bounds 综合协变,逆变,上界,下界 View Bound <% Context Bound 参考文档 Scala中的协变逆变和Java中的协变逆变不一样,看起来更复杂. 本文对Scala中的这些概念做一总结.首先看几个概念: covariant 协变.使你能够使用比原始指定的类型的子类 Contravariance 逆变.使你能够使…
协变,逆变与不变 能在使用父类型的场景中改用子类型的被称为协变. 能在使用子类型的场景中改用父类型的被称为逆变. 不能做到以上两点的被称为不变. 以上的场景通常包括数组,继承和泛型. 协变逆变与泛型(C#,Java) 在C#中,泛型参数的类型缺省是不变的,但是我们可以在定义泛型接口或委托时通过给参数类型加上out或in来标注该参数类型是协变还是逆变. 协变意味着你能把 IEnumerable<string> 用在需要 IEnumerable<object> 的地方. 这里 IEnu…
1 泛型 1)如果我们要求函数的参数可以接受任意类型.可以使用泛型,这个类型可以代表任意的数据类型. 2)例如 List,在创建 List 时,可以传入整型.字符串.浮点数等等任意类型.那是因为 List 在 类定义时引用了泛型.比如在Java中:public interface List<E> extends Collection<E> Scala泛型应用案例1 1)编写一个Message类 2)可以构建Int类型的Message,String类型的Message. 3)要求使用…
泛型接口和泛型委托中经常使用可变性 in  逆变,out  协变 从 list<string>转到list<object> 称为协变 (string 从object 派生,那么 string 转成object 是合理的,子类替换父类是合理的,) 从list<object> 转到 list<string> 称为逆变 (经object 转成string ,将父类转成子类,是不合理的,称为逆变) 1.逆变代码掩饰 static void Main(string[]…
协变(Convariant)和逆变(Contravariant)的出现,使数组.委托.泛型类型的隐式转换变得可能. 子类转换成基类,称之为协变:基类转换成子类,称之为逆变..NET4.0以来,支持了泛型接口的协变和逆变. 泛型协变 如果子类泛型隐式转换成基类泛型,使用泛型协变. 有这样的2个基类和派生类. public class Animal { public virtual void Write() { Console.WriteLine("我是基类"); } } public c…
scala 逆变和协变的概念网上有很多解释, 总结一句话就是 参数是逆变的或者不变的,返回值是协变的或者不变的. 但是为什么是这样的? 协变: 当s 是A的子类, 那么func(s) 是func(A)的子类. 也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变. 个人理解的func(s) 是func(A)的子类的意思是: func(s)的返回值是func(A)的返回值的子类. 逆变: 同协变定义,但是是反过来,即当S是A的子类时,func(S)是func(A)的父类. 如下图所示…