泛型

  1. 泛型的作用:
    1. 泛型泛的是什么型?类型。类型一般化,对多种类型适用,所以叫泛型。
    2. 如果代码块对不同的类型,都有相同的逻辑,那么,可以适用泛型。
    3. 由于不需要对每种类型都声明相同的逻辑,所以,节省了代码量。
  2. 泛型的种类:
    1. 泛型方法:使用了泛型的方法,称之为泛型方法。方法使用的类型一般化(参数,返回值)
    2. 泛型类:类中使用的类型一般化
    3. 泛型接口:接口中使用的类型一般化
    4. 泛型委托:委托使用的类型一般化
  3. 泛型的声明方法
    1. 使用尖括号包裹类型符号,代指使用的类型。下面的U,V,W表示泛型类GenericClass中可能使用的某种类型的名称
    2. public class GenericClass
  4. 泛型的调用方法(继承时也只有这两种方式)
    1. 指明所有的参数。
    2. 让编译器自动推断。
  5. 泛型的约束:
    1. 约束使用的类型。
    2. 泛型约束的种类
      1. 基类约束:约束类型继承的基类,从而能够在相同逻辑的代码块中使用基类的成员。Where T:Base....
      2. 接口约束:约束类型继承的接口.Where T:Interface...
      3. 引用类型约束:约束使用的类型是引用类型。Where T:Class
      4. 值类型约束:约束使用的类型是值类型。Where T:Struct
      5. 无参数构造函数约束:约束使用的类型拥有无参数构造函数:Where T:new()
  6. 泛型的协变与逆变。
    1. 协变
      1. 声明:在类型参数前使用Out声明。该类型参数只能用作方法的返回值,或属性get访问器。
      2. 由于是返回值,所以返回子类可以被当成基类使用,从而使用子类类型的泛型接口或泛型委托能够被当成使用基类类型的泛型接口或泛型委托使用,这种不一致的变化,称之为协变,因为使用基类的地方,用子类来代替,是很自然的;所有动物满足的真命题,鸡也能满足。
    2. 逆变:
      1. 声明:在类型参数前使用In声明。该类型参数只能用作方法的参数,而不能用作返回值。
      2. 由于是参数,所以传入的参数是子类时可以被当成基类使用,从而使用基类类型的泛型接口或泛型委托能够被当成使用子类类型的泛型接口或泛型委托使用,这种不一致的变化,称之为逆变,意思是看起来不自然的。
    3. 其实两者一致,都是需要基类型的地方,提供了一个子类型。如果是返回值,那边变成左边需要一个基类型,却提供了一个子类型的泛型接口或泛型委托,这种搞法看起来比较自然;如果是参数,那么就是需要一个基类型的参数,却提供了一个子类型参数的泛型接口或泛型委托,称之为逆变

你可能感兴趣的:(泛型)