2018-7-26-随笔-泛型

Posted liuqifeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-7-26-随笔-泛型相关的知识,希望对你有一定的参考价值。

类型不是对象,而是对象的模板

泛型不是类型,而是类型的模板

泛型:

1.c#中的泛型只在类、结构、接口、委托、方法中有

泛型类:

创建“构造类型”===就是给”类型参数“赋予”类型实参“

泛型类的构造出的类型都是不同的并且相互独立的

泛型的使用使得代码减少便于维护,但是不容易写,因为太抽象

类型参数的约束:

就是给泛型的“T”一个限定条件,让编译器知道什么类型可以用什么类型不可以用-------约束

泛型中不能处理一些类型的对象,或者不是object的派生类,否则会报错

where语句:

约束都是用where语句列出的,多个约束就用逗号分隔。  多个where语句间没有什么间隔符

where语句没有任何的次序,但是语句的内部有严格的顺序:类名---class(引用类型)---struct(值类型)---接口名---new()(无参构造的类型)

主约束只能有一个(前三个),接口可以有多个,构造约束只能放在最后。

泛型方法:

可以在泛型和非泛型的类、接口、结构中 

泛型方法也可以有约束子句,

泛型方法中如果泛型方法的方法参数和泛型参数一样,在实例调用时就可以不用写出泛型的实参类型

例如:

public void MyMethod <T> (T myVal){}

int myInt = 2;

MyMethon<int>(myInt);-------------正常书写

MyMethon(myInt);----------------简写,推断类型,这样书写编译器可以推断出这个方法的泛型和方法参数是一样的,所以不用写出来了。

泛型类和扩展方法:

理解:在使用一个类时,先定义个静态类(static)类,在这个类中书写一个静态方法(static),方法的参数就是以要使用类类型,不过必须要有this关键字(this Holder<T> h),然后在我们实例要使用的类,就可以直接类的对象调用才写的类方法。调用时不需要参数的,因为就是这个类型对象调用的。

泛型结构:

和泛型类一样

泛型委托:

参数类型<形参类型,返回值类型>,也可以有约束条件

C#中的两个泛型委托:FUNC(T,result)有返回值的  Action(T)没有返回值的

泛型接口:

泛型的接口,要不是方法参数“泛型”,要不就是返回值”泛型“,要不就是都”泛型“

泛型接口最好是泛型类来实现,如果是非泛型类实现,就会在实现的时候写明一个唯一的类型实参(那还定义泛型干嘛)!!!

泛型接口名称和非泛型接口名称不会冲突的

实现泛型接口时要注意防止出现类型实参相同的情况,否则会出现方法一样的情况出现报错

协变:

派生类对象可以赋值给基类的变量这是赋值兼容性。 派生类的引用赋值给基类变量

当派生类的委托实现赋值,再把派生类的委托赋值给基类的委托,发现这个是不行的!!!!因为这是两个委托,理论上是两个不一样的委托没有什么关系的。没有继承关系的,这时的赋值是不会成功的。这是的同级使得不能赋值。在泛型委托中的泛型参数中加”out“,就可以编译成功。

这样的只用返回值类的类型参数的皆可用派生类创建的委托类型 叫做协变

在泛型参数中用”in“,并且委托是只有泛型参数的,叫做逆变

以上是关于2018-7-26-随笔-泛型的主要内容,如果未能解决你的问题,请参考以下文章

Java 泛型泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

Java 泛型泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

Kotlin学习手记--泛型泛型约束泛型型变星投影泛型擦除内联特化

java泛型泛型的内部原理:类型擦除以及类型擦除带来的问题

C#高级语法之泛型泛型约束,类型安全逆变和协变(思想原理)

Java 泛型泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )