泛型中的协变

IEnumerable<Base> 的变量,如下面的代码所示。

IEnumerable<Sons> d = new List<Sons>();
IEnumerable<Base> b = d;

实事上,这正是我之前一篇文章上提到的,派生类集合可以转换为基类集合,这在.net术语中叫到泛型的转协变。

例如,在一个LINQ TO SQL的复杂查询时,你的代码可能是这样

IQueryable<UserAddress> linq1 = from data in new Repository<UserAddress>().GetModel()
                                            select new UserAddress
                                           {
                                               UserID = data.UserID,
                                               ID = data.ID,
                                               Address = data.Address,
                                           };

注意,这段代码会出错,因为LINQ不能返回自己本身的实体,所以必须为返回它的派生类型
  IQueryable<UserAddress> linq1 = from data in new Repository<UserAddress>().GetModel()
                                            select new UserAddress_Ext
                                             {
                                                 UserID = data.UserID,
                                                 ID = data.ID,
                                                 Address = data.Address,
                                             };
这种写法是没有问题的,呵呵,这其实就叫做泛型的协变



相关推荐:

关于JAVA泛型中的通配符类型

  之前对JAVA一知半解时就拿起weiss的数据结构开始看,大部分数据结构实现都是采取通配符的思想,好处不言而喻。     首先建立两个类employee和manager,继承关系如下。其次Pair类是一个简单的泛型类。            通配符的作用就是在泛型设计程序中允许类型参数变化   ...

JAVA 泛型中的通配符 T,E,K,V,?

前言 Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 泛型带来的好处 在没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化...

Java泛型中的通配符

Java泛型中的通配符可以直接定义泛型类型的参数。而不用把该函数定义成泛型函数。 publicclassGenericsTest{ publicstaticvoidmain(String[]args){ List<String>name=newArrayList<String&gt...

java泛型中的通配符

今天在看ArrayList原码是看到这样的一个符号,好奇怪。?表示通配符,表示的意思是匹配E或E的子类,具体类型未知。 1.限定通配符 编写一个类似于ArrayList的动态数据 publicclassGys<T>{ privatefinalstaticintdefault_capaci...

Java 泛型中的通配符

本文内容如下: 1、什么是类型擦除 2、常用的?,T,E,K,V,N的含义 3、上界通配符<?extendsE> 4、下界通配符<?superE> 5、什么是PECS原则 6、通过一个案例来理解?和T和Object的区别 一、什么是类型擦除? 我们说Java的泛型是伪泛型,那...

泛型中的类型约束和类型推断

前一篇文章介绍了泛型的基本概念。在本文中,我们看一下泛型中两个很重要的特性:类型约束和类型推断。 类型约束 相信你还记得前面一篇文章中的泛型方法,在这个泛型方法中,我们就使用了类型约束。 类型约束(typeconstraint)进一步控制了可指定的类型实参,当我们创建自己的泛型类型或者泛型方法的时候...