泛型知识

Posted Prozkb

tags:

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

int   -2147483648~2147483647    21亿

在继承中,子类拥有父类的一切属性和行为,而且任何父类出现的地方,都可以用子类来替代;可谓“长江后浪推前浪”啊

object是一切类的父类

泛型在编译的时候确定类型(延迟思想);

泛型:用一个方法,来满足不同类型的参数;泛型实际上是语法糖,由编译器提供功能;没有性能损失

泛型参数的个数可以随便定义

========================贴代码=====================================================

public class GenericClass//定义一个泛型类
{
public static void show<T>(T tParameter)//泛型是一个方法后<T> 括号里传参数
{
Console.WriteLine("这是{0},类型是{1}",tParameter,tParameter.GetType());
}


public static int Show<T, S>(string s,int t,int d)//泛型传的类型可以是多个T,S
{
int num = Convert.ToInt32(s);

return num + t + d;
}

public static void Add<T>(int i, string s, double d)
{
double dd = i + d;
Console.WriteLine("我是{0},我今年{1}岁",s,dd);
}


public static void ShowObject(object obj)//object 是所有类型的基类,但是在传入类型的时候,可能会牵扯到不同类型之间的装箱和拆箱,有性能损失;泛型没有装拆箱,没有性能损失
{
Console.WriteLine("这是{0},类型是{1}",obj,obj.GetType());
}

public static void ShowT<SPara>(SPara tparameter)//这个任何类型都可以用,只要传入类型,括号里的参数正确就ok
{
Console.WriteLine("这个是泛型类Show T,parameter={0},parameterType={1}",tparameter,tparameter.GetType());
}

public static void ShowTT<SPara,T,S>(SPara tparameter,T t,S s)//传入多个类型
{
Console.WriteLine("这个是泛型类ShowTT,parameter={0},parameterType={1},t={2},tType={3},s={4},sType={5}", tparameter, tparameter.GetType(),t,t.GetType(),s,s.GetType());
}
}

==========================================================================

public class GenericConstaint//定义泛型约束
{
//where后面意思是T不仅要是个class对象,还可以new对象(可以有无参数构造)
public static T Get<T>(T t) where T : class,new ()//必须是个引用类型,string class ....
{

//引用类型的默认值是null
T tt = new T();//约束加了new(),才能new出来

return default(T);
}

public static T GetQuery<T>(T t) where T : struct //必须是个值类型,
{//值类型的默认值不确定
return default(T);
}


public static void SayHi<T>(T t) where T:People//t必须是People类型或者people类型的子类
{
Console.WriteLine("ID:{0},Name:{1}",t.Id,t.name);
t.SayHi();
}
public interface ISaySometing
{
void SayHello();
}

}

public class People
{
public string name{set;get;}
public int Id { set; get; }

public void SayHi()
{
Console.WriteLine("上午好");
}
}

============================================================================

class Program
{

static void Main(string[] args)
{
GenericClass.show<DateTime>(DateTime.Now);

int num= GenericClass.Show<string,string>("1", 1, 1);
Console.WriteLine(num);
//在泛型的单个类型的时候,<T>是传参数的类型;当要传入多个参数的时候,括号里可以有多个参数
GenericClass.Add<int>(4, "zhu", 1.0);
//object 是所有类型的父类

GenericClass.ShowObject("132");//ShowObject方法可以传入各种类型~~~string
GenericClass.ShowObject(1231);//ShowObject方法可以传入各种类型~~~int
GenericClass.ShowObject(DateTime.Now.Year);//ShowObject方法可以传入各种类型~~~DateTime

GenericClass.ShowT<string>("朱凯宾");// public static void ShowT<SPara>(SPara tparameter)只要传入相对应的T
GenericClass.ShowT<DateTime>(DateTime.Now);
GenericClass.ShowTT<DateTime,int,string >(DateTime.Now,100,"猪八戒");


Console.WriteLine("**********泛型约束****************");
//泛型约束声明后,类型参数必须满足约束
//GenericConstaint.Get<int>(3);// 这样会报错,泛型约束where是class,class是引用类型,int是值类型
// GenericConstaint.Get<string>("132");//string是引用类型,因为约束加了new(), 但是string类型是没有无参数构造的,所有会报错
GenericConstaint.GetQuery<int>(123);//值类型
//DateTime 是个结构体,不是引用类型
GenericConstaint.GetQuery<DateTime>(DateTime.Now);

People p = new People()
{
Id = 1,
name = "我是people"

};
GenericConstaint.SayHi<People>(p);

 

Console.ReadLine();

//用泛型没有装箱和拆箱,所以没有性能损失
//用object类型的时候会有拆箱和装箱~~~~~有性能损失



}
}

以上是关于泛型知识的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型知识总结篇

java泛型的一些知识点:Java泛型--泛型应用--泛型接口泛型方法泛型数组泛型嵌套

Java泛型知识点:泛型类泛型接口和泛型方法

重点知识学习--[泛型学习]

基础知识(12)- 泛型程序设计

JAVA泛型知识点