转自:http://blog.csdn.net/yi_Afly/article/details/52071260 1. 前言 之前几篇博文,有些地方涉及到了协变性、逆变性与不变性在Java中的表现,所以这篇博文将重点记录这方面的内容,并辅以JDK源码中的一些实例,加以说明。 2. 定义 这里讨论的协 ...
分类:
编程语言 时间:
2017-07-05 01:14:17
阅读次数:
318
1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。 数组的协变性可能会导致一些错误,比如下面的代码: public static ...
分类:
编程语言 时间:
2017-07-04 00:58:47
阅读次数:
193
一、先来唠一唠? 上一篇泛型适宜本意还想继续往下写写,来一下协变与逆变,奈何不知道怎么该往下写,等等我思考一下,在继续写~接下来聊聊数据结构这一话题,想到数据结构就想起了那一年我在工院上课就睡觉的时光,真实暴遣天物呀,不扯开始话题,数据结构可能在我们工作的时候用的不算太多,但是实际上不管java或者 ...
分类:
其他好文 时间:
2017-06-27 09:50:00
阅读次数:
170
看源码的时候看到: Scala上界(<:)和下界(>:) 1) U >: T 这是类型下界的定义,也就是U必须是类型T的父类(或本身,自己也可以认为是自己的父类)。 2) S <: T 这是类型上界的定义,也就是S必须是类型T的子类(或本身,自己也可以认为是自己的子类)。 然后scala中的泛型符号 ...
分类:
其他好文 时间:
2017-06-16 16:44:35
阅读次数:
136
假设突然看见这个问题。我们常常会想当然。一个梨子是水果,一筐梨子是一筐水果吗? 程序中,我们较少使用到协变性(covariant)。一个经典的问题:父类Sup有方法m()。有子类Sub public class CovariantDemo{ public static void main(Strin ...
分类:
其他好文 时间:
2017-06-11 21:12:13
阅读次数:
133
1、协变性是指方法能返回从委托的返回类型派生的一个类型。 2、逆变性是指方法获取的参数可以是委托的参数类型的基类。 分割线 如上面的例子,SomeMethod 的返回类型(string)派生自委托的返回类型(Object);这种协变性是允许的。SomeMethod 的参数类型(Stream)是委托的 ...
分类:
其他好文 时间:
2017-06-05 20:24:49
阅读次数:
246
逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画图详细解析逆变与协变。 变的概念 我们都知道.Net里或者说在OO的世界里,可以安全地把子类的引用赋给父类引 ...
分类:
其他好文 时间:
2017-05-31 22:20:19
阅读次数:
356
目录 二十一、限制类型的可见性 二十二、通过定义并实现接口替代继承 二十三、理解接口方法和虚方法的区别 二十四、用委托实现回调 二十五、用事件模式实现通知 二十六、避免返回对内部类对象的引用 二十七、让类型支持序列化 二十八、提供组粒度的因特网服务 API 二十九、支持泛型协变和逆变 二十一、限制类 ...
逆变和协变在存在于强类型语言中,尽管非常少提及,可是里面蕴含了面向对象的世界观。感谢和我一起讨论这个问题的人。 这里用了C#、Scala的语法作为演示样例,事实上逆变和协变的概念跟语言本身关系不大,事实也是如此。 一、定义 逆变的參数能够由指定的类型的子类型取代,协变的參数能够由指定类型的父类型取代 ...
分类:
其他好文 时间:
2017-05-14 12:11:15
阅读次数:
181
关于协变和逆变要从面向对象继承说起。继承关系是指子类和父类之间的关系;子类从父类继承所以子类的实例也就是父类的实例。比如说Animal是父类,Dog是从Animal继承的子类;如果一个对象的类型是Dog,那么他必然是Animal。 协变逆变正是利用继承关系 对不同参数类型或返回值类型 的委托或者泛... ...