Generic(泛型)

什么是泛型:“通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用”。

简单来说泛型就是为了使一些代码能够重复利用。

泛型的经历:

在早期.net框架中不同的参数类型需要声明不同的方法;

 1   public class CommonMethod
 2     {
 3         /// <summary>
 4         /// 打印个int值
 5         /// </summary>
 6         /// <param name="iParameter"></param>
 7         public static void ShowInt(int iParameter)
 8         {
 9             Console.WriteLine("This is {0},parameter={1},type={2}",
10                 typeof(CommonMethod).Name, iParameter.GetType().Name, iParameter);
11         }
12
13         /// <summary>
14         /// 打印个string值
15         /// </summary>
16         /// <param name="sParameter"></param>
17         public static void ShowString(string sParameter)
18         {
19             Console.WriteLine("This is {0},parameter={1},type={2}",
20                 typeof(CommonMethod).Name, sParameter.GetType().Name, sParameter);
21         }
22
23         /// <summary>
24         /// 打印个DateTime值
25         /// </summary>
26         /// <param name="oParameter"></param>
27         public static void ShowDateTime(DateTime dtParameter)
28         {
29             Console.WriteLine("This is {0},parameter={1},type={2}",
30                 typeof(CommonMethod).Name, dtParameter.GetType().Name, dtParameter);
31         }
32 }

后来开发人员觉得这样声明太麻烦了,提出了Object参数来替代,因为

1 任何父类出现的地方,都可以使用子类来替换
2 object是一切类型的父类

 1         /// <summary>
 2         /// 打印个object值
 3         /// 1 任何父类出现的地方,都可以使用子类来替换
 4         /// 2 object是一切类型的父类
 5         /// </summary>
 6         /// <param name="oParameter"></param>
 7         public static void ShowObject(object oParameter)
 8         {
 9             //((People)tParameter).Id
10             Console.WriteLine("This is {0},parameter={1},type={2}",
11                 typeof(CommonMethod), oParameter.GetType().Name, oParameter);
12         }
13     }

但是声明object参数方法调用时会经常的进行装箱拆箱,这样会影响程序的运行效率。

后来在.net2.0框架中引用的泛型的概念,这就是泛型的由来。

 1  public class GenericMethod
 2     {
 3         /// <summary>
 4         /// </summary>
 5         /// <typeparam name="T"></typeparam>
 6         /// <param name="tParameter"></param>
 7         public static void Show<T>(T tParameter)
 8         {
 9             Console.WriteLine("This is {0},parameter={1},type={2}",
10                 typeof(GenericMethod), tParameter.GetType().Name, tParameter.ToString());
11         }
12 }

泛型的思想: 延迟声明,把参数类型的声明推迟到调用

但是单单这样声明一个泛型方法是有缺陷的,比如说声明一个people对象,想打印出people的属性,单声明一个泛型方法是做不到这个功能的。

1 public class People
2     {
3         public int Id { get; set; }
4         public string Name { get; set; }
5
6         public void Hi()
7         { }
8
9     }

不信的可以用上面的泛型方法试试,只会出现object下的方法。

这就出现了泛型约束。

泛型约束:它通知编译器,只有这个类型的对象或从这个类型派生的对象,可被用作类型参数。一旦编译器得到这样的保证,它就允许在泛型类中调用这个类型的方法。

按照我的理解就是说,定义了一个泛型后,然后声明一个约束,告诉这个方法是满足哪些条件的约束,这样才能直接使用基类的属性和方法

 public class Constraint
    {
        /// <summary>
        /// 泛型约束,基类约束:
        /// 1 在泛型方法内可以直接使用基类的属性和方法
        /// 2 调用的时候,只能传递基类或者基类的子类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tParameter"></param>
        public static void Show<T>(T tParameter) where T : People
        {
            Console.WriteLine("This is {0},parameter={1},type={2}",
                typeof(GenericMethod), tParameter.GetType().Name, tParameter.ToString());
            //((People)tParameter).Id
            //tParameter.
            Console.WriteLine("id={0} name={1}", tParameter.Id, tParameter.Name);
            tParameter.Hi();

}

泛型约束分为下面几种:


约束


描述


where T: struct


类型参数必须为值类型。 默认返回return default(T);


where T : class


类型参数必须为引用类型。默认返回return null;


where T : new()


类型参数必须有一个公有、无参的构造函数。当于其它约束联合使用时,new()约束必须放在最后。


where T : <base class name>


类型参数必须是指定的基类型或是派生自指定的基类型。


where T : <interface name>


类型参数必须是指定的接口或是指定接口的实现。可以指定多个接口约束。接口约束也可以是泛型的。

还有一些关于泛型类、接口、委托的声明。
public class GenericClass<T>
    {

        public void Show(T t)
        {
            Console.WriteLine(t);
        }

        public T Get(T t)
        {
            List<int> iList = null;
            return t;
        }
    }

    public interface IGet<T>
    { }

    public delegate void GetHandler<T>();
}

  

时间: 2024-10-21 03:06:41

Generic(泛型)的相关文章

Generic泛型

1.问题 未使用泛型时,元素的类型不安全:操作麻烦,可能需要强制转换import java.util.ArrayList;import java.util.List;import org.junit.Test;import day8.Customer; public class GenericTest {    @Test    public void testCollectionGeneric() {        List l1=new ArrayList();        l1.add(

asp.net数据类型--泛型

asp.net有很多的数据类型,同时c#等均是强数据类型,在使用的过程,存在因数据类型不一致,在编译时通过,在使用过程中出错的情况,因此从2.0起,增加泛型这种类型.这种类型,在定义时不指定类型,而在使用过程指定类型. using命名空间 using system.collections.generic /*Generic:泛型*/ 常用的系统已定义的类型 1.dictionary(字典)类 在dictionary泛型中,后面有两个string参数,在系统定义为TKey.KValue(即键值对)

java的动态数据结构和泛型

动态数据结构和泛型 0 详细介绍java中的数据结构 1 1 List 5 1.1 ArrayList 5 2 Set 6 2.1 HashSet与TreeSet的区别 6 3 Map 8 4 迭代器 9 5 泛型 9 0 详细介绍java中的数据结构 也许你已经熟练使用了java.util包里面的各种数据结构,但是我还是要说一说java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类

泛型深入--java泛型的继承和实现、泛型擦除

泛型实现类: package generic; /** * 泛型父类:子类为“富二代”:子类的泛型要比父类多 * 1,保留父类的泛型-->子类为泛型类 * 2,不保留父类泛型-->子类按需实现 * * * 子类[重写方法]的参数类型 -->随父类而定 * 子类新增的方法,参数类型随子类而定 * 子类中使用父类的[属性] -->随父类而定 * 子类使用自己的属性-->随子类而定 * @author Administrator * */ public abstract class

数组、集合、泛型解析——【新生入学系统】

一.概念(from 百科) 数组:把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标. 集合:集合是一组可变数量的数据项(可为0)的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作. 泛型:在程序编码中一些包含参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象. 二.进化史 开始用内存中的一个位置映射一个值,用"变量"来使用这个值.进一步发展成,用变量来引用一组值,数组诞生.后来有了集合,它是更强的的数组,依

Java 8 新特性之泛型的类型推导

1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是“类型的变量”.这种类型变量可以用在类.接口和方法的创建中.理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Apple>();

java5核心基础泛型(2):泛型在反射中的应用

如何通过反射获取指定参数类型的构造函数? 贴代码如下: package highBasic.generic; /** * 泛型入门 */ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; public class GenericTest { public static void main(St

java5核心基础之泛型(1)

什么是泛型? 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型.泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念.(引自百科) 理解了以下代码,就会明白为何要用泛型! 下面还是直接贴出代码,看看这个java5的新特性,泛型的使用吧: package highBasic.generic; /** * 泛

I学霸官方免费教程三十:Java基础教程之泛型

泛型 先给大家举个例子:如现在有一家工厂,可以生产手机,也可以生产电脑.以后还可能生产其他产品.如果给某个工厂加上了泛型,就规定了这个工厂只能生产手机或电脑,不能再生产其他产品了. 实例: package generic; /**  * 产品枚举Product  * @author 学霸联盟 - 赵灿  */ public enum Product { 手机,电脑 } package generic; /**  * 手机类Phone  * @author 学霸联盟 - 赵灿  */ public

NET平台和C#

.NET平台和C#编程 一.深入.NET框架 1..NET框架具有两个组件:CLR(公共语言运行时)和FCL(框架类库),CLR是.NET框架的基础 2.框架核心类库: System.Collections.Generic:泛型操作 System.IO:IO流操作 System.Net:网络编程 System.Data:ADO.NET结构的类的访问 System.Windows.Forms:窗体操作 System.Drawing:图形操作 二.深入C#数据类型 1.结构体:结构体是由struct