泛型定义跟实例化的一些疑问
泛型定义和实例化的一些疑问
泛型定义的时候用的是占位符,但是如果实例化的时候就变成了类List集合么
------解决方案--------------------
如果用点位符,解释起来不是太容易懂,楼主可以尝试换一个名词,将泛型类,叫作“模板类”。
当实例化一个“模板类”时,先根据传入的泛型参数,根据“模板”,将类中相应的泛型类型“替换”掉,这样得到了一个非泛型类。
然后再根据这个非泛型类,创建实例。
比如有泛型类定义:
而我们现在要这么用:
可以看到,我们将 string 作为泛型参数,所以我们第一步,按“模版”的方式,将MyTemplate<T>中的T,全部替换成为string。就得到了下面的类:
之所以要使用泛型类,用于减少重复代码。
如果我们定义了很多个类似的类或者方法 ,而我们发现,这些类或者方法,除了部分参数或者变量的类型不一样之外,其它的代码几乎完全一样,那么意味着我们应该考虑使用泛型类或者泛型方法。
------解决方案--------------------
反例:
Nullable<T>
Task<T>
ICompareable<T>
泛型定义的时候用的是占位符,但是如果实例化的时候就变成了类List集合么
------解决方案--------------------
如果用点位符,解释起来不是太容易懂,楼主可以尝试换一个名词,将泛型类,叫作“模板类”。
当实例化一个“模板类”时,先根据传入的泛型参数,根据“模板”,将类中相应的泛型类型“替换”掉,这样得到了一个非泛型类。
然后再根据这个非泛型类,创建实例。
比如有泛型类定义:
public class MyTemplate<T>
{
public MyTemplate(T value)
{
this.Value = value;
}
public T Value { get; private set; }
}
而我们现在要这么用:
var instance = new MyTemplate<string>("asdf");
可以看到,我们将 string 作为泛型参数,所以我们第一步,按“模版”的方式,将MyTemplate<T>中的T,全部替换成为string。就得到了下面的类:
//伪代码
public class MyTemplate<string>
{
public MyTemplate(string value)
{
this.Value = value;
}
public string Value { get; private set; }
}
之所以要使用泛型类,用于减少重复代码。
如果我们定义了很多个类似的类或者方法 ,而我们发现,这些类或者方法,除了部分参数或者变量的类型不一样之外,其它的代码几乎完全一样,那么意味着我们应该考虑使用泛型类或者泛型方法。
------解决方案--------------------
反例:
Nullable<T>
Task<T>
ICompareable<T>