泛型简单介绍:

可以使用泛型声明的元素:类、接口、方法、委托

泛型之前:
泛型之前使用object封装不同类型的参数,缺点:性能差、运行时判断类型(不安全)...
泛型是在编译期间转为实际类型副本,所以性能好,还可以使用约束对泛型进行约束

泛型约束:
约束泛型类型必须满足约束。使用泛型约束后,可以像使用约束类型的方式使用泛型变量

约束种类:
where T:class//引用类型约束
where T:new()//无参构造函数约束,加了此约束后可以使用无参构造函数创建实例:T t = new T();
where T:类//具体类或其子类约束
where T:接口//具体接口或其子类约束
where T:struct//值类型约束

where T:People,new(),ISport  //多个约束

协变逆变:

协变逆变只能放在接口或委托中使用

个人理解:协变逆变可以使我们的代码更灵活,帮我们做了类型转换操作。协变是子类转父类;逆变是父类转子类。

协变(out):修饰返回值,泛型只能出现在成员的返回类型上,不能做传入参数

协变案例:

    public class Bird
{
public string ID { get; set; }
}
public class Sparrow : Bird
{
public string Name { get; set; }
} static void Main(string[] args)
{
Bird bird = new Sparrow();//正确,一只麻雀就是一只鸟
List<Bird> birdList = null;
//birdList = new List<Sparrow>();//报错,一群麻雀和一群鸟没有继承关系
//只能用下面这两种方式
birdList = new List<Sparrow>().Select(s=>(Bird)s).ToList();//方式1
birdList = new List<Sparrow>().Cast<Bird>().ToList();//方式2
//上面这两种方法写起来比较麻烦,所以有了协变,协变就是解决这个问题
//为什么下面这个没有报错
IEnumerable<Bird> iBirdList = new List<Sparrow>();
//就是因为IEnumerable<out T>接口是支持协变的,协变使用out关键字
}

逆变与协变相反,是父类转换子类,使用in关键字。泛型类型只能出现在传入参数上

逆变案例:

    public interface ICustomerEnumerable<in T>
{ }
public class CustomerEnumerable<T> : ICustomerEnumerable<T>
  {    }   static void Main(string[] args)
{
//in 逆变
ICustomerEnumerable<Sparrow> sparrowList = new CustomerEnumerable<Bird>();
}

最新文章

  1. BZOJ1853 [Scoi2010]幸运数字
  2. NVelocity 表格行奇偶样式变换
  3. 2016年12月13日 星期二 --出埃及记 Exodus 21:8
  4. Problem:Minesweeper Master
  5. OpenGL ES2学习笔记(9)-- 转换矩阵
  6. HDU 1509 Windows Message Queue(队列)
  7. 201521123044 《Java程序设计》第2周作业-Java基本语法与类库
  8. 博客志第一天——判断一个整数N是否是完全平方数?
  9. Java实现内部类
  10. SharePoint 2007 制作值班表
  11. Linux Namespace : UTS
  12. Apache Thrift的C++多线程编程定式
  13. mysql 原理 ~ sql执行
  14. Debug常用命令
  15. change color3
  16. 运行wmic命令异常:java.io.IOException: Cannot run program &quot;wmic&quot;: CreateProcess error=2, ϵͳ&#213;Ҳ&#187;&#181;&#189;ָ&#182;解决记录
  17. Java之优先队列
  18. Eth 部署智能合约
  19. linux文件属性介绍
  20. Python基础入门(一)

热门文章

  1. 实验一 Linux基础与Java开发环境
  2. 【网络知识之四】HTTP/2
  3. Unity Shader 2D水流效果
  4. Editor模式下实例化Prefab
  5. [JAVA] 日常填坑 java.lang.SecurityException: Prohibited package name: java.xxx
  6. RC4算法
  7. Oppo Reno2 不允许安装非正式签名应用
  8. 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作【华为云技术分享】
  9. Python的设计哲学--zen of Python
  10. DNS:从零搭建公司内网DNS服务器