关于泛型类型参数的约束

news2024/10/6 6:41:53

默认情况下,泛型类型参数T可以是任意类型;如果我们希望泛型类型参数希望是某个类型或者是实现某个接口,或者继承某个类,又或者是某一个类型比如值类型,这就需要对类型参数T进行约束,泛型类型参数的约束语法格式如下:

......<T1,T2> where T1:XXX where T2:XXX,XXXX

限定类型参数where, 如果泛型类有多个类型参数约束,逐一用where关键字进行约束定义.

一般常用的泛型类型参数约束如下:

      -T:struct  类型参数为数值型Nullable类型除外)

      -T:class  类型参数为引用类型:类,接口,委托,数组等

      -T:new()  类型参数类含无参构造函数,一般放约束项最后一个

      -T:<基类名>  类型参数必须是某一基类或派生自指定的基类

      -T:<接口名类型参数必须是指定的接口或指定接口的实现

public class MyGeneric<T> where T:struct{}

public class MyGeneric<T> where T:class,IComparable{}

public class MyGene<T1,T2> where T1:class,ICollection where T2 : class, new() { }

下面demo是通过泛型类加上泛型类型参数约束,要求类型参数T必须实现IComparable接口,类内实现了通用类型数组的冒泡排序:.

public class Sorthelper<T>  where T:IComparable
{
    public void MySort(T[] arr)
    {
            
        for (int i = 1; i <= arr.Length - 1; i++)//i-循环次数
            for (int j = 0; j <= arr.Length - i - 1; j++)//j循环是一轮轮循环
                if (arr[j].CompareTo(arr[j+1]) == 1)//arr[j]是类型参数T的对象,因为T约束项实现了IComparable,所以可以调用Compare方法
                {
                    T tmp;
                    tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
    }
}
pu

然后我们在Main()方法中定义了整型数组,调用泛型类的冒泡排序方法,代码如下:

int[] numbers = { 3, 5, 7, 2, 1, 6, 9, 10, 4 };
Sorthelper<int> mycls = new Sorthelper<int>();

Console.WriteLine("排序前:");
foreach (var item in numbers)
    Console.Write(item + "\t");


mycls.MySort(numbers);

Console.WriteLine("\n排序后:");
foreach (var item in numbers)
    Console.Write(item + "\t");

此时泛型类的类型参数被指定为int,数组元素为int类型,我们查看下int的结构体定义可以发现.Net已经帮我们实现了IComparable接口,所以int元素可以直接用CompareTo方法进行数据比较排序.

执行Main()方法代码, 数组排序结果如下:

以上demo数据元素类型是.Net定义的int32类型,已经默认实现了IComparable接口成员,如果我们自定义类型,比如自定义实例类型Person,数据元素类型为Person对象,要求对Person对象组成的数组进行排序,这时我们就必须写完Person类型后,在类内实现IComparable接口成员Compare方法,否则冒泡麦序方法内无法对元素大小比较,Person类代码如下:

public class Person:IComparable
{
    public string Name { get; set; }
    public Person (string name) => this.Name = name;
    public int CompareTo(object obj) => this.Name.CompareTo((obj as Person).Name);
}

在Main()方法实例化Person对象数组,并按照姓名进行排序,如下:

//数组元素为复杂的自定义类型的排序,一般选择该类型的某一成员进行排序,如某字段.
Person[] people = {
    new Person("Tom"),
    new Person("Lily"),
    new Person("Lucy"),
    new Person("David"),
};

Console.WriteLine();
Console.WriteLine("排序前:");
foreach (var item in people)
    Console.Write(item.Name + "\t");
            
new Sorthelper<Person>().MySort(people);

Console.WriteLine("\n排序后:");
foreach (var item in people)
    Console.Write(item.Name + "\t");
Console.ReadKey();

执行以上代码,排序后的结果如下:

大家知道,IComparable接口有泛型版本IComparable<T>,如上demo如果将类型参数约束该为IComparable<T>,即public class Sorthelper<T>  where T:IComparable<T>.

同样Perosn类实现的接口也改为IComparable<T>,接口实现的方法也同步更新如下:

public class Person:IComparable<Person>
{
    public string Name { get; set; }
    public Person (string name) => this.Name = name;

    //实现IComparable接口
    //public int CompareTo(object obj) => this.Name.CompareTo((obj as Person).Name);

    //实现IComparable<T>接口
    public int CompareTo(Person other)
    {
        return this.Name.CompareTo(other.Name);
    }
}

运行代码对自定义数组元素进行排序,执行结果也是一样的!

泛型的类型参数约束笔记,抛砖引玉,就这么多,后续会继续更新本贴添加新的demo///

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二维码门楼牌管理应用平台建设:场所记录与智能化管理

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、二维码门楼牌管理应用平台的建设意义四、结语 前言 随着科技的飞速发展&#xff0c;二维码技术已经深入到了我们生活的方方面面。在城市管理中&#xff0c;二维码门楼牌管理应…

如何使用宝塔面板搭建MySQL数据库并实现无公网IP远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

jeecg-boot 3.6使用微服务启动详细配置

1&#xff1a;运行sql文件 2&#xff1a;配置host 路径如下 127.0.0.1 jeecg-boot-redis 127.0.0.1 jeecg-boot-mysql 127.0.0.1 jeecg-boot-nacos 127.0.0.1 jeecg-boot-gateway 127.0.0.1 jeecg-boot-system 127.0.0.1 jeecg-boot-xxljob 127.0.0.1 jeecg-boot-rabbitmq 3…

Databend 开源周报第 139 期

&#x1f4e2; Databend 现已默认启用全新聚合哈希表实现&#xff0c;在 Hits 基准测试中单条查询性能提升最高达 40% &#xff01; Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://…

WPF 多语言切换及ResourceDictionary的Source路径填写

WPF 多语言切换 1. 添加资源字典 新增两个资源字典&#xff0c;里面分别存储不同语言的文本 <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s…

✌2024/4/4—力扣—整数转罗马数字

代码实现&#xff1a; 方法一&#xff1a;硬编码数字 const char *thousands[] {"", "M", "MM", "MMM"}; const char *hundreds[] {"", "C", "CC", "CCC", "CD", "D",…

SpringBoot学习之Kibana下载安装和启动(Mac版)(三十二)

一、简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。 …

橘子学JDK之JMH-02(BenchmarkModes)

一、案例二代码 这次我们来搞一下官网文档的第二个案例&#xff0c;我删除了一些没用的注释&#xff0c;然后对代码做了一下注释的翻译&#xff0c;可以看一下意思。 package com.levi;import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import …

深入理解JVM后端优化技术-方法内联

相关系列 深入理解JVM后端优化技术-逃逸分析(Escape Analysis)-CSDN博客 深入理解JVM后端优化技术-锁消除&#xff08;Lock Elision)-CSDN博客 深入理解JVM后端优化技术-锁粗化(Lock Coarsening)-CSDN博客 jvm只是负责依次将字节码指令逐次转换成机器码。而在转换过程中&#x…

智能电表(AMI):革新电力行业的利器

近年来&#xff0c;随着电力行业的不断发展和科技的进步&#xff0c;智能电表&#xff08;AMI&#xff09;作为一种新型的电能测量设备&#xff0c;逐渐引起了人们的关注。AMI不仅具有传统电表的计量功能&#xff0c;还具备远程通信、数据采集、实时监测和多种数据分析等多功能…

(3)(3.1) 英特尔Realsense深度摄像头(二)

文章目录 前言 5 配置ArduPilot 6 地面测试&#xff1a;飞行前验证 7 飞行测试 8 实验 9 数据闪存记录 前言 本文介绍如何将英特尔 Realsense 深度摄像头(Intel Realsense Depth Camera)与 ArduPilot 配合使用&#xff0c;以实现避障(obstacle avoidance)。该方法使用在…

Linux(CentOS7)部署 y-api 接口管理平台

目录 前言 前置环境 mongodb node 安装 y-api 部署页面 启动 y-api 基本使用教程 前言 前后端分离时代&#xff0c;前后端通过接口文档来协作开发项目。一般开发过程中&#xff0c;由后端先编写接口文档&#xff0c;然后交付给前端&#xff0c;这时候前后端都根据这个…

Linux/Lame

Lame 今天随便乱逛发现这台机器貌似是 HackTheBox 平台的第一台机器&#xff0c;而且我还没做过&#xff0c;从简介上来看的话是一台很简单的机器&#xff0c;快快的玩一下 Enumeration nmap 首先用 nmap 扫描一下常见的端口&#xff0c;发现系统对外开放了 21,22,139,445 端…

如何在CentOS安装Nexus容器无公网IP远程管理本地仓库

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

免费专利下载网站(亲测有效!无需注册登录)

1.中国专利全文下载 本数据库收录了自1985年以来的全部中国专利数据摘要及全文&#xff0c;包括中国专利申请公开说明书、授权公告说明书&#xff0c;涵盖全部发明专利、实用新型专利、外观设计专利。药物在线已开发中国专利全文下载极速版!支持专利全文在线浏览&#xff0c;专…

Django交易商场

Hello&#xff0c;我是小恒不会java 最近学习django&#xff0c;写了一个demo,学到了不少东西。 我在GitHub上开源了&#xff0c;提示‘自行查看代码&#xff0c;维护&#xff0c;运行’。 最近有事&#xff0c;先发布代码了&#xff0c;我就随缘维护更新吧 介绍&#xff1a; 定…

计算机的发展趋势

本文 我们来说计算机的发展趋势 目前来讲 计算机是朝着 巨型化 微型化 网络化 智能化发展 巨型化 指功能巨型化 是指其高速运算、大存储容量和强功能的巨型计算机。其运算能力一般在每秒百亿次以上、内存容量在几百兆字节以上。 主要用于航空航天、军事、气象、人工智能、生…

FME学习之旅---day21

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;AutoCAD 变换 相关的文章 为您的 DWG 赋予一些样式&#xff1a;使用 DWGStyler、模板文件、块等 FME数据检查器在显示行的方式上受到限制。它只能显示线条颜色&#xff0c;而…

Linux锁的使用

一、临界资源与临界区 多线程会共享例如全局变量等资源&#xff0c;我们把会被多个执行流访问的资源称为临界资源&#xff0c;我们是通过代码访问临界资源的&#xff0c;而我们访问临界资源的那部分代码称为临界区。 实现一个抢票系统 只有一个线程抢票时 #include <ios…

雷达学习之多普勒频率

一、多普勒频率如何产生&#xff1f; 雷达的原理是发射一些无线电脉冲来探测目标&#xff0c;并通过回波的延时来计算目标与雷达的距离&#xff0c;但当目标为运动物体时&#xff0c;在回波向目标传输的同时&#xff0c;目标也会远离或接近回波&#xff0c;所以会导致回波信号…