当前位置: 首页 > news >正文

十三、泛型

文章目录

  • 1、泛型
  • 2、泛型约束
    • 2.1、值类型
    • 2.2、引用类型
    • 2.3、存在无参公共构造函数的非抽象类型
    • 2.4、某个类本身或其派生类
    • 2.5、某个接口的派生类
    • 2.6、另一个泛型类型本身或其派生类型
  • 3、约束组合使用
  • 4、多个泛型约束

1、泛型

  • class 类名<T>
  • interface 接口名<T>
  • 函数名<T>(...)
  • 泛型可以有多个,用 , 分开
// 泛型类
class MyTest<T>
{
    public T Value;
    
    // 这个不是泛型方法哦(只有函数名后面有<>的才是)
    public void Test(T t)
    {
        // ...
    }
}

// 普通类
class MyTest
{
    // 泛型方法
    public void Test<T>(T t)
    {
        Console.WriteLine(t);
    }
    
    // 泛型方法
    public void Test<T>()
    {
        T t = default(T);
        // ...
    }
}

// 泛型接口
interface ICommon<T>
{
    T Value
    {
        set;
        get;
    }
}

// 普通类继承泛型接口要指定泛型具体类型
class MyCommonImpl : ICommon<int>
{
    // ...
}

// 泛型类与泛型接口所用泛型相同则可不指定接口泛型具体类型
class MyCommonImpl02<T> : ICommon<T>
{
    // ...
}

2、泛型约束

  • 关键字:where
  • 一共 6 种约束
    • 值类型:where 泛型字母:struct
    • 引用类型:where 泛型字母:class
    • 存在无参公共构造函数的非抽象类型:where 泛型字母:new()
    • 某个类本身或其派生类:where 泛型字母:类名
    • 某个接口的派生类:where 泛型字母:接口名
    • 另一个泛型类型本身或其派生类型:where 泛型字母:另一个泛型类型字母

2.1、值类型

class Test<T> where T:struct
{
    public T Value;

    public void TestFun<K>(K k) where K:struct
    {
        Console.WriteLine(k);
    }
}

// 某方法内↓↓↓
Test<int> test = new Test<int>();
test.Value = 10;
test.TestFun(test.Value); // 10

2.2、引用类型

class Test<T> where T:class
{
    public T Value;

    public void TestFun<K>(K k) where K:class
    {
        Console.WriteLine(k);
    }
}

// 某方法内↓↓↓
Test<string> test = new Test<string>();
test.Value = "嘎嘎";
test.TestFun(test.Value); // "嘎嘎"

2.3、存在无参公共构造函数的非抽象类型

class Test<T> where T:new()
{
    public T Value;

    public void TestFun<K>(K k) where K:new()
    {
        Console.WriteLine(k);
    }
}

class MyCons
{
    public override string ToString()
    {
        return "这是一个有无参构造的类的ToString()";
    }
}

// 某方法内↓↓↓
Test<MyCons> test = new Test<MyCons>();
test.Value = new MyCons();
test.TestFun(test.Value); // "这是一个有无参构造的类的ToString()"

2.4、某个类本身或其派生类

class Test<T> where T:MyCons
{
    public T Value;

    public void TestFun<K>(K k) where K:MyCons
    {
        Console.WriteLine(k);
    }
}

class MyCons
{
    public override string ToString()
    {
        return "这是MyCons的ToString()";
    }
}

// 某方法内↓↓↓
Test<MyCons> test = new Test<MyCons>();
test.Value = new MyCons();
test.TestFun(test.Value); // "这是MyCons的ToString()"

2.5、某个接口的派生类

class Test<T> where T : ITest
{
    public T Value;

    public void TestFun<K>(K k) where K : ITest
    {
        Console.WriteLine(k);
    }
}

interface ITest
{ }

class MyTest : ITest
{
    public override string ToString()
    {
        return "这是 ITest 实现类 MyTest 的ToString()";
    }
}

// 某方法内↓↓↓
Test<ITest> test = new Test<ITest>();
test.Value = new MyTest();
test.TestFun(test.Value); // "这是 ITest 实现类 MyTest 的ToString()"

2.6、另一个泛型类型本身或其派生类型

class Test<T, U> where T : U
{
    public T ValueT;

    public U ValueU;

    public void TestFun<K, V>(K k, V v) where K : V
    {
        Console.WriteLine("{0}{1}", k, v);
    }
}

interface ITest
{ }

class MyTest : ITest
{
    public override string ToString()
    {
        return "这是 ITest 实现类 MyTest 的ToString()";
    }
}

class YourTest : ITest
{
    public override string ToString()
    {
        return "这是 ITest 实现类 YourTest 的ToString()";
    }
}

// 某方法内↓↓↓
Test<ITest, ITest> test = new Test<ITest, ITest>();
test.ValueT = new MyTest();
test.ValueU = new YourTest();
test.TestFun(test.ValueT, test.ValueU);
// 这是 ITest 实现类 MyTest 的ToString()这是 ITest 实现类 YourTest 的ToString()

3、约束组合使用

  • 不冲突的情况下随意组合
class Test<T> where T:class, new()
{}

4、多个泛型约束

  • 罗列 where 就完了(别随手加逗号啥的,空开即可)
class Test<T, V> where T:class, new() where V:struct
{}

相关文章:

  • 【C语言进阶(NEW)】一、数据储存详解|数据类型介绍|整形在内存中的存储|浮点型在内存中的存储
  • 每天一个面试题:ThreadLocal底层原理和实现Demo
  • 【C语言航路】第七站:结构体初阶
  • Spring Cloud(十四):微服务灰度发布 --- Discovery
  • 你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?
  • 计算机毕业设计Java家教到家平台(源码+系统+mysql数据库+lw文档)
  • 华为云低代码技术:让矿区管理“智变”,一览无遗
  • 简单宠物网页设计作业 静态HTML动物介绍网页作业 DW宠物网站模板下载 大学生简单野生动物网页作品代码
  • 车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)
  • 【蓝桥杯】第十四届模拟赛第一期及第二期填空汇总
  • 03、自定义镜像上传阿里云
  • 并发基本原理(四):AQS源码解析1-ReentrantLock的lock实现原理
  • C语言刷题(2)
  • 电子印章结构以及规范讲解
  • Mysql面试题汇总
  • 抗疫众志成城网页设计成品 抗击疫情感动人物网页制作模板 大学生抗疫静态HTML网页源码 dreamweaver网页作业致敬逆行者网页设计作品
  • Python基础-8-函数
  • linux 中 mq_notify 创建线程监控消息队列实现原理
  • 计算机毕业设计Java家用饰品在线销售系统(源码+系统+mysql数据库+lw文档)
  • 06_openstack之创建云主机和常见错误
  • 李乐成任工业和信息化部部长
  • 制定出台民营经济促进法有何重大意义?全国人大常委会法工委回应
  • 工行一季度净赚841亿元降3.99%,营收降3.22%
  • 总有黑眼圈是因为“虚”吗?怎么睡才能改善?
  • 杭州银行一季度净赚超60亿增逾17%,增速较去年同期有所回落
  • 牛市早报|今年国内核电项目审批首次开闸,离境退税起退点下调