用任意类型编写代码——一文带你了解泛型编程

简介: 泛型编程中,代码可以被处理成任何类型的对象。泛型编程与非泛型编程的区别是,数据的“类型”(通常标记为 T )没有被明确说明。

1 前言

还记得在数据结构书中的 <T> 类型吗?本文带你看看了解这个泛型编程。


泛型编程中,代码可以被处理成任何类型的对象。泛型编程与非泛型编程的区别是,数据的“类型”(通常标记为 T )没有被明确说明。


泛型编程范式的掌握具有挑战性,因为它需要高度的抽象性(完全忽略数据的类型)。目前,C++(模板)、Java、C#,以及 Golang 都有对泛型编程的内置支持,并包括一个大型的通用集合和数据结构的标准库。


2 为什么选择泛型

Object 是所有其他类的超类,对象引用可以引用任何对象。这些功能缺乏类型安全性。泛型添加了这种类型的安全功能。


Java 中的泛型类似于 C++中的模板。例如,像 HashSet、ArrayList, HashMap 等类很好地使用了泛型。泛型类型的两种方法之间存在一些根本差异。

class Test<T> {
    // An object of type T is declared
    T obj;
    Test(T obj) { this.obj = obj; } // 构造器
    public T getObject() { return this.obj; }
}
class Main {
    public static void main(String[] args)
    {
        // 整数类型实例
        Test<Integer> iObj = new Test<Integer>(15);
        System.out.println(iObj.getObject());
        // 字符串类型实例
        Test<String> sObj = new Test<String>("宇宙之一粟");
        System.out.println(sObj.getObject());
    }
}

输出:

15
宇宙之一粟


对于泛型类型(通常表示为 T,你也可以选择其他的),不能对正在处理的实例类型做出假设。由于在泛型代码中不能做任何类型的假设,所以相同的逻辑有可能以一致和可重复的方式对许多类型起作用。类型不可知的性质使得泛型成为一个强大的语言特性,但它也使得不习惯的工程师难以阅读或理解泛型代码。


严格来说,有些语言如 C# 和 Java 有一个基础的 Object 类,所有的类都继承自它。在这些情况下,你可以对类型进行假设,只要你把它当作基础对象。


泛型编程实际上是将类型从代码中抽象出来。类型与代码逻辑的分离可以通过使用类型参数来完成,但也可以通过使用编程语言中的其他抽象机制(如接口或反射)来完成。


虽然在大多数语言中,接口是由类明确定义和实现的,但情况并非总是如此。例如,Go 和 TypeScript 都使用隐式接口,不直接在类型上预先声明,而是通过类型判断过程推断出来。隐式接口类型化是一个强大的工具。Go 的隐式接口:

// Example of an interface in Go
type Reader interface {
    Read(p []byte) (n int, err error)
}
type myReader struct {}
// Implement the Reader interface
func (r *myReader) Read(p []byte) (n int, err error) {
    return 0, nil
}


3 数据结构和泛型

数据结构是许多编程语言中使用的数据组织和操作的模式。最常见的数据结构是一类元素的集合。因为列表只是一类元素的集合,所以很容易创建一个泛型列表。大多数计算机科学学生学习的第一个数据结构是一个链表。链表的数据结构是一类元素的列表,但每个项目都包含一个指向链表中下一个元素的引用(或指针)。

4 泛型编程的优点

  • 更少的模板代码;更多的业务逻辑
  • 通用代码可以适用于任何数据类型
  • 可以大大减少代码的重复性
  • 错误修复只需要在一个地方发生
  • 代码的可重用性可以大大增加
  • 代码的稳定性可以大大增加
  • 理论上,泛型代码应该能够达到 100% 的测试覆盖率,将回归的机会降到最低。


5 总结

编写泛型代码是一件非常有趣的事情,也是学习纯算法设计的好方法,不需要打字那么麻烦。

相关文章
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
488 201
|
4天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
604 157
|
4天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
10天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
608 46