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

Flutter Dart 泛型详解

引言

在 Flutter 开发中,Dart 语言的泛型是一项强大且实用的特性。泛型允许我们在定义类、方法或接口时使用类型参数,这样可以编写更加灵活、可复用且类型安全的代码。下面将详细介绍 Dart 泛型的各个方面,并结合代码示例进行说明。

1. 泛型的基本概念

泛型的核心思想是将类型作为参数传递,从而使得代码可以处理多种不同类型的数据,而不需要为每种类型都编写重复的代码。通过使用泛型,我们可以在编译时进行类型检查,提高代码的安全性和可读性。

2. 泛型类

泛型类是指在定义类时使用类型参数的类。这样,类中的属性、方法等可以使用这个类型参数,从而实现对不同类型数据的处理。

代码示例

// 定义一个泛型类 Box,它可以存储任意类型的数据
class Box<T> {T value;Box(this.value);T getValue() {return value;}
}void main() {// 创建一个存储整数的 Box 对象Box<int> intBox = Box<int>(10);print('整数 Box 中的值: ${intBox.getValue()}');// 创建一个存储字符串的 Box 对象Box<String> stringBox = Box<String>('Hello, Dart!');print('字符串 Box 中的值: ${stringBox.getValue()}');
}

代码解释

  • class Box<T> 定义了一个泛型类 Box,其中 <T> 是类型参数,它可以代表任意类型。
  • T value 表示 Box 类中的 value 属性的类型是 T,即可以是任意类型。
  • Box(this.value) 是构造函数,用于初始化 value 属性。
  • T getValue() 方法返回 value 属性,其返回类型也是 T
  • main 函数中,我们分别创建了存储整数和字符串的 Box 对象,并调用 getValue 方法获取存储的值。

3. 泛型方法

泛型方法是指在方法定义中使用类型参数的方法。泛型方法可以独立于类的泛型定义,使得方法更加灵活。

代码示例

// 定义一个泛型方法,用于交换两个变量的值
T swap<T>(T a, T b) {T temp = a;a = b;b = temp;return a;
}void main() {// 交换两个整数int resultInt = swap<int>(5, 10);print('交换后的整数: $resultInt');// 交换两个字符串String resultString = swap<String>('Hello', 'World');print('交换后的字符串: $resultString');
}

代码解释

  • T swap<T>(T a, T b) 定义了一个泛型方法 swap,其中 <T> 是类型参数,T 表示方法的参数和返回值的类型。
  • 在方法内部,通过临时变量 temp 交换了两个参数的值,并返回交换后的第一个参数。
  • main 函数中,分别调用 swap 方法交换了两个整数和两个字符串,并打印交换后的结果。

4. 泛型接口

泛型接口是指在接口定义中使用类型参数的接口。实现泛型接口的类需要指定具体的类型参数。

代码示例

// 定义一个泛型接口
abstract class Listable<T> {void add(T item);T get(int index);
}// 实现泛型接口的类
class MyList<T> implements Listable<T> {List<T> _items = [];void add(T item) {_items.add(item);}T get(int index) {return _items[index];}
}void main() {// 创建一个存储整数的 MyList 对象MyList<int> intList = MyList<int>();intList.add(1);intList.add(2);print('MyList 中索引为 1 的整数: ${intList.get(1)}');// 创建一个存储字符串的 MyList 对象MyList<String> stringList = MyList<String>();stringList.add('Apple');stringList.add('Banana');print('MyList 中索引为 0 的字符串: ${stringList.get(0)}');
}

代码解释

  • abstract class Listable<T> 定义了一个泛型接口 Listable,其中 <T> 是类型参数,接口中定义了 addget 两个抽象方法。
  • class MyList<T> implements Listable<T> 表示 MyList 类实现了 Listable 泛型接口,MyList 类中使用 List<T> 来存储元素,并实现了 addget 方法。
  • main 函数中,分别创建了存储整数和字符串的 MyList 对象,并调用 addget 方法进行元素的添加和获取。

5. 泛型约束

有时候,我们希望泛型类型参数满足一定的条件,这时可以使用泛型约束。在 Dart 中,可以使用 extends 关键字来实现泛型约束。

代码示例

// 定义一个抽象类 Animal
abstract class Animal {void makeSound();
}// 定义一个 Dog 类,继承自 Animal
class Dog extends Animal {void makeSound() {print('汪汪汪');}
}// 定义一个泛型类,要求类型参数必须是 Animal 的子类
class AnimalBox<T extends Animal> {T animal;AnimalBox(this.animal);void playSound() {animal.makeSound();}
}void main() {Dog dog = Dog();AnimalBox<Dog> dogBox = AnimalBox<Dog>(dog);dogBox.playSound();
}

代码解释

  • abstract class Animal 定义了一个抽象类 Animal,其中包含一个抽象方法 makeSound
  • class Dog extends Animal 定义了一个 Dog 类,继承自 Animal 类,并实现了 makeSound 方法。
  • class AnimalBox<T extends Animal> 定义了一个泛型类 AnimalBox,使用 extends Animal 对类型参数 T 进行约束,要求 T 必须是 Animal 的子类。
  • void playSound() 方法调用了 animal 对象的 makeSound 方法。
  • main 函数中,创建了一个 Dog 对象和一个 AnimalBox<Dog> 对象,并调用 playSound 方法播放声音。

6. 泛型在集合中的应用

Dart 的集合类(如 ListSetMap 等)都广泛使用了泛型,以确保集合中元素的类型安全。

代码示例

void main() {// 创建一个存储整数的 ListList<int> intList = [1, 2, 3, 4, 5];print('整数 List: $intList');// 创建一个存储字符串的 SetSet<String> stringSet = {'Apple', 'Banana', 'Cherry'};print('字符串 Set: $stringSet');// 创建一个键为字符串,值为整数的 MapMap<String, int> scoreMap = {'张三': 80, '李四': 90, '王五': 75};print('分数 Map: $scoreMap');
}

代码解释

  • List<int> 表示创建一个只能存储整数的列表。
  • Set<String> 表示创建一个只能存储字符串的集合。
  • Map<String, int> 表示创建一个键为字符串,值为整数的映射。

总结

Dart 的泛型是一个非常强大的特性,它可以提高代码的复用性、灵活性和类型安全性。通过泛型类、泛型方法、泛型接口和泛型约束等,我们可以编写更加通用和高效的代码。在实际的 Flutter 开发中,合理运用泛型可以让我们的代码更加健壮和易于维护。

相关文章:

Flutter Dart 泛型详解

引言 在 Flutter 开发中&#xff0c;Dart 语言的泛型是一项强大且实用的特性。泛型允许我们在定义类、方法或接口时使用类型参数&#xff0c;这样可以编写更加灵活、可复用且类型安全的代码。下面将详细介绍 Dart 泛型的各个方面&#xff0c;并结合代码示例进行说明。 1. 泛型…...

Windows Docker 报错: has no HTTPS proxy,换源

pull python 3.7报错&#xff1a; 尝试拉取Docker 测试库hello world也失败 尝试使用临时镜像源&#xff0c;可以成功拉取&#xff1a; sudo docker pull docker.m.daocloud.io/hello-world说明确实是网络问题&#xff0c;需要配置镜像源&#xff0c;为了方便&#xff0c;在d…...

Java:Arrays类:操作数组的工具类

文章目录 Arrays类常见方法SetAll(); 代码排序如果数组中存储的是自定义对象 Arrays类 常见方法 SetAll(); 注意&#xff1a; 不能用新的数组接是因为修改的是原数组&#xff0c;所以完了要输出原数组发现会产生变化参数是数组下标变成灰色是因为还能简化&#xff08;Lambda…...

【面试场景题-Redis中String类型和map类型的区别】

今天在面试中碰到一个场景题&#xff1a;在 Redis 中存储 100 万用户数据时&#xff0c;使用 String 类型和 Hash&#xff08;Map&#xff09;类型的主要区别是什么&#xff1f;体现在以下几个方面&#xff1a; 1. 存储结构与内存占用 String 类型 存储方式&#xff1a;每个用…...

List附加对象

List里面的某个对象需要修改&#xff0c;赋值 可以使用ALL或者ForEach&#xff0c;All的话&#xff0c;不能直接使用赋值对象只能赋值对象的某个字段 static void Main(string[] args){List<UserData> UserDatas new List<UserData>{new UserData { Id 1, Name …...

VLLM专题(三十六)—自动前缀缓存

PagedAttention 的核心思想是将每个请求的 KV 缓存划分为 KV 块。每个块包含固定数量的标记(tokens)对应的注意力键(keys)和值(values)。PagedAttention 算法允许将这些块存储在非连续的物理内存中,从而通过按需分配内存来消除内存碎片。 为了自动缓存 KV 缓存,我们利…...

相机光学(四十七)——相纸材质

1. 光面相纸 光面相纸表面光滑&#xff0c;亮度高&#xff0c;反光性好&#xff0c;能够呈现出清晰、鲜艳的图像效果&#xff0c;适合用于表现色彩艳丽、反差要求较高的题材&#xff0c;如产品照、艺术照和风景照。然而&#xff0c;这种相纸容易沾上指纹和灰尘。 2. 绒面相纸…...

数据表100多字段如何写mapper文件的xml

编写一个包含100多个字段的插入语句通常涉及到使用<mapper>标签来定义映射规则&#xff0c;特别是在使用MyBatis这样的持久层框架时。 1. 定义<mapper>命名空间 order表 <mapper namespace"com.example.mapper.orderMapper"><!-- 插入语句 --…...

只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”

当消费电子领域普遍追求“更轻更薄”的设计美学时&#xff0c;遨游三防平板不止于此&#xff0c;还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中&#xff0c;三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足&#xff0c;常因环境…...

拉取镜像太慢?一文解决!

# 拉取 Docker 镜像太慢&#xff1f;一文解决&#xff01;&#x1f680;在国内使用 Docker 拉取镜像时&#xff0c;可能会遇到速度慢甚至失败的情况。别担心&#xff01;本文带你快速优化 Docker 拉取方法&#xff01;&#x1f525;01 | 确保 Docker Hub 登录认证 &#x1f510…...

基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; DeepSpeek服务器繁忙&#xff1f;这几种替代方案帮你流畅使用&#xff01;&#xff08;附本地部署教程&#xff09;-CSDN博客 10分钟上手…...

(分块)洛谷 P2801 教主的魔法 题解

之前学过 莫队 算法&#xff0c;其运用了分块思想&#xff1b;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a&#xff08;一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai​∈[1,1000]&#xff09;。要求执行 q q q 次操作&…...

[蓝桥杯 2023 省 B] 飞机降落(不会dfs的看过来)

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…...

信创系统极速文件查找:locate 命令详解

原文链接&#xff1a;信创系统极速文件查找&#xff1a;locate 命令详解 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇信创终端操作系统上 locate 命令详解的文章。在 Linux 及信创终端操作系统&#xff08;如 统信 UOS、麒麟 KOS&#xff09;中&#xff0c;查找…...

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09; 文章目录 C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09;一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…...

PostgreSQL:语言基础与数据库操作

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

RK3568 Android11 sh366006驱动

sh366006.c /* 谁愿压抑心中怒愤冲动咒骂这虚与伪与假从没信要屈膝面对生命纵没有别人帮一生只靠我双手让我放声疯狂叫囔今天的他 呼风可改雨不可一世太嚣张 --《不可一世》Beyond */ #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h…...

蓝桥杯学习——二叉树+奇点杯题目解析

基础认知 一、二叉树种类&#xff1a; 1.满二叉树。记深度k&#xff0c;节点数量2^k-1。 2.完全二叉树&#xff1a;除了底层&#xff0c;其余全满&#xff0c;底部从左到右连续。 3&#xff0c;平衡二叉搜索树&#xff1a;左子树和右子树高度差不大于1。 二、存储方式&…...

基于django+vue的购物商城系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…...

AI安全、大模型安全研究(DeepSeek)

DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…...

卷积神经网络 - 汇聚层

卷积神经网络一般由卷积层、汇聚层和全连接层构成&#xff0c;本文我们来学习汇聚层。 汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer)&#xff0c;其作用是进 行特征选择&#xff0c;降低特征数量&#xff0c;从而减少参数数量。 卷积层虽然可以显著减少网络中连接的…...

蓝桥杯备赛-贪心-管道

问题描述 有一根长度为 lenlen 的横向的管道&#xff0c;该管道按照单位长度分为 lenlen 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的&#xff0c;位于 LiLi​ 的阀门会在 SiSi​ 时刻打开&#xff0c;并不断让水流入管道。 对…...

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…...

Nodejs使用redis

框架&#xff1a;koa&#xff0c;通过koa-generator创建 redis: 本地搭建&#xff0c;使用默认帐号&#xff0c;安装说明地址以及默认启动设置&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 中间件&#x…...

GitHub 超火的开源终端工具——Warp

Warp 作为近年来 GitHub 上备受瞩目的开源终端工具&#xff0c;以其智能化、高性能和协作能力重新定义了命令行操作体验。以下从多个维度深入解析其核心特性、技术架构、用户评价及生态影响力&#xff1a; 一、背景与核心团队 Warp 由前 GitHub CTO Jason Warner 和 Google 前…...

计算机视觉技术探索:美颜SDK如何利用深度学习优化美颜、滤镜功能?

时下&#xff0c;计算机视觉深度学习正在重塑美颜技术&#xff0c;通过智能人脸检测、AI滤镜、深度美肤、实时优化等方式&#xff0c;让美颜效果更加自然、精准、个性化。 那么&#xff0c;美颜SDK如何结合深度学习来优化美颜和滤镜功能&#xff1f;本文将深入解析AI在美颜技术…...

应用商店上新:Couchbase Enterprise Server集群

可移植的冗余数据平台&#xff0c;这往往是创建可扩展的云原生应用程序的先决条件。而不依赖特定平台的工具可用于为多云、多区域工作负载提供企业级应用所需的灵活性。 ​Couchbase是一种高性能NoSQL数据库&#xff0c;专为当今复杂的云生态系统所需的动态扩展能力而设计。最近…...

Redis解决缓存击穿问题——两种方法

目录 引言 解决办法 互斥锁&#xff08;强一致&#xff0c;性能差&#xff09; 逻辑过期&#xff08;高可用&#xff0c;性能优&#xff09; 设计逻辑过期时间 引言 缓存击穿&#xff1a;给某一个key设置了过期时间&#xff0c;当key过期的时候&#xff0c;恰好这个时间点对…...

前端 Blob 详解

前端 Blob 详解 1. 什么是 Blob&#xff1f; Blob&#xff08;Binary Large Object&#xff09;表示二进制大对象&#xff0c;用于存储二进制数据。在前端开发中&#xff0c;Blob 常用于处理文件、图像、视频等二进制数据。 2. 创建 Blob 可以通过 Blob 构造函数创建 Blob …...

Debezium + Kafka-connect 实现Postgres实时同步Hologres

基于 Debezium Kafka 的方案实现 PostgreSQL 到 Hologres 的实时数据同步&#xff0c;是一种高可靠性、高扩展性的解决方案。以下是详细的实现步骤&#xff1a; 1. 方案架构 Debezium&#xff1a;捕获 PostgreSQL 的变更数据&#xff08;CDC&#xff09;&#xff0c;并将变更…...