泛型介绍(接上一篇,具体的事例随后呈上)

2.2接口约束 为了规定某个数据类型必须实现某个接口,需要声明一个接口约束(interface constraint).有了这种约束之后,甚至不需要执行类型转换,就可以调用一个显示的接口成员实现. 为了确保T类型参数都是先了IComparable接口,

public class Binary<T> where T:System.IComparable{...}

编译器会确保每次使用Binary类的时候,都必须指定一个实现了IComparable接口的类型参数.

2.3 struct/class 约束

另一个重要的泛型约束是将类型参数限制为一个值类型或者一个引用类型.编译器不允许在一个约束中将System.ValueType指定成基类.相反,C#提供了特殊的语法,这种语法同时适用于引用类型.在这种语法中,不是为T指定一个基类.相反,只需要指定关键字struct或者class.

例:

Public struct Nullable<T>:IFormattable,IComparable,IComparable<Nullable<T>>,INullable where T:struct
{//.......}

2.4多个约束 对于任何给定的类型参数,都可以指定任意数量的接口作为约束,但基类约束只能指定一个,因为一个类可以实现任意数量的接口,但肯定只能从一个类继承.每个新约束都在一个以逗号分隔的列表中声明,约束列表跟在泛型类型名称和一个冒号之后.如果有多个类型参数,那么每个类型名称的前面都要使用一个where关键字.如下事例,EntityDictionary类包含两个类型参数:Tkey和TValue.TKey类型参数有两个接口约束,而TValue类型参数有一个基类约束.例:

Public class EntityDictionary<TKey,TValue>:
System.Collections.Generic.Dictionary<TKey,TValue>
Where TKey:IComparable,IFormattable
Where TValue:EntityBase

1.泛型方法 为了定义泛型方法,需要紧接在方法名之后添加类型参数语法,如

public T method<T>(T params)
{
return params;
}

泛型方法也允许指定约束:

public T method<T>(T params)
		where T:IComparable
{
return params;
}

2.Default关键字: 要确定用于创建泛型类实例的类型,需要了解一个最基本的情况:他们是引用类型还是值类型.若不知道这个情况,就不能用下面的代码赋予null值:

public class myGenericClass<T1,T2,T3>
{
T1 t1;
public myGenericClass()
{
t1=null;
}
}

如果T1是值类型,则t1不能是null,所以这段代码将不会编译.幸好,我们可以用default关键字的新用法解决了它.

public myGenericClass()
{
t1=default(T1);
}

其结果是:如果t1是引用类型,就给它赋予null,如果它是值类型,就赋予默认值.如数字类型,这个默认值就是0.

几个泛型类型的示例: 2.5.1定义泛型结构

public struct myStruct<T1,T2>
{
public T1 item1;
public T2 item2;}

2.5.2 定义泛型接口

interface myInterfacee<T>{}

2.5.3.定义泛型方法

public T GetDefault<T>()
{return default(T);}

2.5.4定义泛型委托

public delegate T1 myDelegate<T1,T2>(T2 op1,T2 op2) where T1:T2

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java爬坑系列

【Java入门提高篇】Day19 Java集合类详解(二)Map接口

  上一篇里介绍了集合家族里的大族长——Collection接口,今天来看看集合家族里的二族长——Map接口。

892
来自专栏java学习

Java每日一练(2017/7/19)

本期题目: (单选题) 1、设int x=1,float y=2,则表达式x/y的值是:() A 0 B 1 C 2 D 以上都不是 ---- (单选题)2、若...

2688
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻block的本质(二)

1924
来自专栏郭耀华‘s Blog

java匿名内部类

匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <...

3038
来自专栏和蔼的张星的图像处理专栏

C++面向对象编程一些拾遗

虽然说是拾遗,但是这里有一大部分是我以前没有看过的,简书的markdown不支持生成目录,可能需要手动来一个了。

582
来自专栏xingoo, 一个梦想做发明家的程序员

【面试虐菜】—— JAVA面试题(2)

1 String = 与 new 的不同 使用“=”赋值不一定每次都创建一个新的字符串,而是从“字符串实例池”中查找字符串。使用“new”进行赋值,则每次都创建...

1845
来自专栏Google Dart

Dart 中final和const的使用详解 原

----final:只能被设一次值,在声明处赋值,值和普通变量的设值一样,可以是对象、字符串、数字等,用于修饰值的表达式不变的变量;

611
来自专栏流媒体

C++异常处理

0.png 这里创建了两个对象一个在堆中动态创建temp.一个在栈中temp1。执行结果看到temp1自动被析构,而temp未被析构。c++在...

642
来自专栏Zephery

2017-03-10学习笔记

1.Integer和int,装箱拆箱 1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)...

3528
来自专栏IT可乐

JDK1.8源码(一)——java.lang.Object类

  本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址。   首先介绍JDK中所有类的基类——java.lang.Object。   ...

49215

扫描关注云+社区