Dar语法基础-泛型
泛型
如果查看基本数组类型 List 的 API 文档,您会发现该类型实际上是 List<E>。 <…> 表示法将 List 标记为泛型(或参数化)类型——具有正式类型参数的类型。 按照惯例,大多数类型变量的名称都是单字母的,例如 E、T、S、K 和 V。
Why use generics?
泛型通常是类型安全所必需的,但泛型比仅允许代码运行有更多好处:
- 正确指定泛型类型会生成更好的代码。
- 使用泛型来减少代码重复。
如果你打算让一个列表只包含字符串,你可以将它声明为 List<String>(读作“字符串列表”)。
var names = <String>[];
names.addAll(['Seth', 'Kathy', 'Lars']);
names.add(42); // Error
使用泛型的另一个原因是减少代码重复。 泛型允许您在多种类型之间共享单一接口和实现,同时仍然利用静态分析。 例如,假设您创建了一个用于缓存对象的接口:
abstract class ObjectCache {Object getByKey(String key);void setByKey(String key, Object value);
}
需要此接口的特定于字符串的版本,因此您创建了另一个接口:
abstract class StringCache {String getByKey(String key);void setByKey(String key, String value);
}
通用类型可以省去创建所有这些接口的麻烦。 相反,您可以创建一个带有类型参数的接口:
abstract class Cache<T> {T getByKey(String key);void setByKey(String key, T value);
}
在此代码中,T 是替代类型。 它是一个占位符,您可以将其视为开发人员稍后定义的类型。
Using collection literals
列表、集合和映射文字可以参数化。 参数化文字就像已经看到的文字一样,除了在左括号之前添加 <type>(对于列表和集合)或 <keyType, valueType>(对于Map)。 下面是一个使用类型文字的例子:
var names = <String>['Seth', 'Kathy', 'Lars'];
var uniqueNames = <String>{'Seth', 'Kathy', 'Lars'};
var pages = <String, String>{'index.html': 'Homepage','robots.txt': 'Hints for web robots','humans.txt': 'We are people, not machines'
};
Using parameterized types with constructors(将参数化类型与构造函数一起使用)
var views = Map<int, View>();
以下代码创建一个具有整数键和视图类型值的映射:
var nameSet = Set<String>.from(names);
void main() {var names = ['aa', 'bb', 'cc', 'aa'];var nameSet = Set<String>.from(names);print(nameSet);
}Log
{aa, bb, cc}
Generic collections and the types they contain(通用集合及其包含的类型)
Dart 泛型类型是具体化的,这意味着它们在运行时携带它们的类型信息。 例如,可以测试集合的类型:
var names = <String>[];
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List<String>); // true
注意:相比之下,Java 中的泛型使用擦除,这意味着在运行时删除泛型类型参数。 在 Java 中,你可以测试一个对象是否是一个 List,但你不能测试它是否是一个 List<String>。
Restricting the parameterized type(限制参数化类型)
在实现泛型类型时,您可能希望限制可以作为参数提供的类型,以便参数必须是特定类型的子类型。 您可以使用扩展来做到这一点。
一个常见的用例是通过使类型成为 Object 的子类型(而不是默认的 Object?)来确保类型不可为 null。
class Foo<T extends Object> {// Any type provided to Foo for T must be non-nullable.
}
除了 Object 之外,还可以将 extends 与其他类型一起使用。 下面是一个扩展 SomeBaseClass 的例子,这样 SomeBaseClass 的成员就可以在类型 T 的对象上被调用:
class Foo<T extends SomeBaseClass> {// Implementation goes here...String toString() => "Instance of 'Foo<$T>'";
}class Extender extends SomeBaseClass {...}
可以使用 SomeBaseClass 或其任何子类型作为泛型参数:
var someBaseClassFoo = Foo<SomeBaseClass>();
var extenderFoo = Foo<Extender>();
也可以不指定泛型参数:
var foo = Foo();
print(foo); // Instance of 'Foo<SomeBaseClass>'
指定任何非 SomeBaseClass 类型都会导致错误.
var foo = Foo<Object>(); //会报错
Using generic methods 使用泛型方法
方法和函数也允许类型参数:
T first<T>(List<T> ts) {// Do some initial work or error checking, then...T tmp = ts[0];// Do some additional checking or processing...return tmp;
}
在这里,第一个 (<T>) 上的泛型类型参数允许在多个地方使用类型参数 T:
- 在函数的返回类型 (T) 中。
- 在参数类型 (List<T>) 中。
- 在局部变量 (T tmp) 的类型中。
Libraries and visibility
import 和 library 指令可以帮助您创建模块化和可共享的代码库。 库不仅提供 API,还是一个隐私单元:以下划线 (_) 开头的标识符仅在库内部可见。 每个 Dart 应用程序都是一个库,即使它不使用库指令。
可以使用包来分发库。
如果您好奇为什么 Dart 使用下划线而不是访问修饰符关键字,如 public 或 private,请参阅 SDK 问题 33383。Add public and private access modifiers to language · Issue #33383 · dart-lang/sdk · GitHub
Using libraries
使用 import 指定如何在另一个库的范围内使用一个库中的命名空间。
例如,Dart web 应用程序通常使用 dart:html 库,它们可以像这样导入:
import 'dart:html';
import 唯一需要的参数是指定库的 URI。 对于内置库,URI 具有特殊的 dart: 方案。 对于其他库,您可以使用文件系统路径或 package: 方案。 package: scheme 指定包管理器(例如 pub 工具)提供的库。 例如:
import 'package:test/test.dart';
注意:URI 代表统一资源标识符。 URL(统一资源定位符)是一种常见的 URI。
Specifying a library prefix
如果导入两个具有冲突标识符的库,那么可以为一个或两个库指定一个前缀。 例如,如果 library1 和 library2 都有一个 Element 类,那么可能有这样的代码:
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;// Uses Element from lib1.
Element element1 = Element();// Uses Element from lib2.
lib2.Element element2 = lib2.Element();
Importing only part of a library
如果只想使用库的一部分,可以有选择地导入库。 例如:
延迟加载(也称为延迟加载)允许 Web 应用程序在需要库时按需加载库。 以下是您可能会使用延迟加载的一些情况:
- 减少web app的初始启动时间。
- 执行 A/B 测试——例如,尝试算法的替代实现。
- 加载很少使用的功能,例如可选屏幕和对话框。
只有dart compile js支持延迟加载。 Flutter 和 Dart VM 不支持延迟加载。 要了解更多信息,请参阅问题 #33118 和问题 #27776。
https://github.com/dart-lang/sdk/issues/33118
https://github.com/dart-lang/sdk/issues/27776
要延迟加载库,您必须首先使用 deferred as 导入它。
import 'package:greetings/hello.dart' deferred as hello;
当您需要库时,使用库的标识符调用 loadLibrary()。
Future<void> greet() async {await hello.loadLibrary();hello.printGreeting();
}
等待关键字暂停执行,直到加载库。 有关异步和等待的更多信息,请参阅异步支持。
可以在库上多次调用 loadLibrary() 而不会出现问题。 该库仅加载一次。
使用延迟加载时请记住以下几点:
- 延迟库的常量不是导入文件中的常量。 请记住,这些常量在加载延迟库之前不存在。
- 您不能在导入文件中使用延迟库中的类型。 相反,考虑将接口类型移动到由延迟库和导入文件导入的库。
- Dart 隐式地将 loadLibrary() 插入到您使用 deferred 作为命名空间定义的命名空间中。 loadLibrary() 函数返回一个 Future。
The library directive
要指定库级别的文档注释或元数据注释,请将它们附加到文件开头的库声明中。
/// A really great test library.
@TestOn('browser')
library;
Implementing libraries
有关如何实施库包的建议,请参阅创建库包,包括:Creating packages | Dart
- 如何组织库源代码。
- 如何使用导出指令。
- 何时使用 part 指令。
- 如何使用条件导入和导出来实现支持多个平台的库。
相关文章:
Dar语法基础-泛型
泛型 如果查看基本数组类型 List 的 API 文档,您会发现该类型实际上是 List<E>。 <…> 表示法将 List 标记为泛型(或参数化)类型——具有正式类型参数的类型。 按照惯例,大多数类型变量的名称都是单字母的࿰…...
rt-thread------串口(一)配置
系列文章目录 rt-thread 之 fal移植 rt-thread 之 生成工程模板 文章目录系列文章目录前言一、串口的配置step1:通过串口名字找到串口句柄step2:配置串口参数step3:设置串口接收回调函数step4:打开串口设备前言 UART(…...
Android - 自动系统签名
一、系统签名 以下是两类应用开发场景: 普通应用开发:使用公司自定义 keystore 进行签名,如:微信、支付宝系统应用开发:使用 AOSP 系统签名或厂商自定义 keystore 进行签名,如:设置、录音 系…...
SSH 服务详解 (八)-- vscode 通过 SSH 远程连接 linux 服务器
vscode 通过 SSH 远程连接 linux 服务器 SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 (三)-- 使用 SSH 代理 SSH 服务详解 (四)-- 本地调用远程主机的命令 SSH 服务详解 (五)-- 远程文件拷贝…...
【PTA Advanced】1060 Are They Equal(C++)
目录 题目 Input Specification: Output Specification: Sample Input 1: Sample Output 1: Sample Input 2: Sample Output 2: 思路 C 知识点UP 代码 题目 If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered …...
仿真与测试:通过Signal Builder模块生成输入信号
本文研究通过Signal Builder模块生成输入信号的方法。 文章目录1 生成输入信号2 仿真过程2.1 搭建被测模型2.2 搭建Signal Builder输入模块2.3 配置仿真log及仿真3 总结1 生成输入信号 在汽车的电控软件开发中,经常会在Simulink模型内部进行单元测试。单元测试的本…...
云计算培训靠谱吗?
怎么算靠谱的培训呢? 举个例子: 我想参加云计算培训找个工作,机构满足了我的要求,有工作了,但是不是做云计算相关的。 小强也参加了云计算培训,想学好云计算成为技术大牛,最后专业学得普普通…...
力扣SQL刷题10
目录标题618. 学生地理信息报告--完全不会的新题型1097. 游戏玩法分析 V - 重难点1127. 用户购买平台--难且不会618. 学生地理信息报告–完全不会的新题型 max()函数的功效:(‘jack’, null, null)中得出‘jack’,(nul…...
31 岁生日快乐,Linux!
Linux 迎来了 31 岁生日,所以和我一起庆祝 Linux 的 31 岁生日吧,喝上一杯好香槟和一个美味的蛋糕!虽然有些人不承认 8 月 25 日是 Linux 的生日,但我知道。1991 年 8 月 25 日,21 岁的芬兰学生 Linus Benedict Torval…...
分布式ID生成方案
文章目录前言一、分布式ID需要满足的条件二、分布式ID生成方式基于UUID数据库自增数据库集群数据库号段模式redis ID生成基于雪花算法(Snowflake)模式百度(uid-generator)美团(Leaf)滴滴(Tinyid…...
合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库
基础资料 基于Air103开发板:🚗 Air103 - LuatOS 文档 上手:开发上手 - LuatOS 文档 探讨重点 对官方社区库接口类redis的fbd数据库及fskv库的调用及示例进行复现及分析,了解两库的基本原理及操作方法。 软件及工具版本 Luat…...
【论文精读】Deep Residual Learning for Image Recognition
1 Degradation Problem💦 深度卷积神经网络在图像分类方面取得了一系列突破。深度网络自然地将低/中/高级特征和分类器以端到端的多层方式集成在一起,特征的“层次”可以通过堆叠层数(深度)来丰富。最近的研究揭示了网络深度是至关重要的,在具…...
Lesson2:基础语法、输出输入
一、基础语法 1、行结构 一个Python程序可分为许多逻辑行,一般来说:一个语句就是一行代码,不会跨越多行。 """比如下面的Python程序,一共有3个逻辑行,每一行都通过print()输出一个结果。""…...
android 9.0去掉前置摄像头闪光灯功能
1.1概述 在9.0的系统rom定制化开发中,在系统中camera2也是非常重要的一部分功能,在很多场合会用到camera2拍照视频,等等功能, 但是在使用过程中发现系统camera2在使用的时候,在前置摄像头进行拍照的时候,会出现闪光灯的情况,对于产品来说,者就是一个大问题,所以产品要求…...
静态分析工具Cppcheck在Windows上的使用
之前在https://blog.csdn.net/fengbingchun/article/details/8887843 介绍过Cppcheck,那时还是1.x版本,现在已到2.x版本,这里再总结下。 Cppcheck是一个用于C/C代码的静态分析工具,源码地址为https://github.com/danmar/cppcheck …...
用一年时间脱胎换骨
生活习惯篇早睡早起11点30之前必须睡觉按时吃饭特别是早餐控糖,少吃甜食早起刷牙后,喝一杯温水保持身材,养成运动健身的习惯养成持续写作的习惯记录选题,金句,素材断舍离,定期整理,把不用的东西…...
全景拼接python旗舰版
前言在这个项目中,您将构建一个管道,将几幅图像拼接成一个全景图。您还将捕获一组您自己的图像来报告最终的结果。步骤1 特征检测与描述本项目的第一步是对序列中的每幅图像分别进行特征检测。回想一下我们在这个类中介绍过的一些特征探测器:…...
(C语言)常见的字符串与内存操作函数
问:1. Solve the problems:我想用三种方法求字符串的长度怎么办?2. strlen处理的字符串中有什么时需要注意:什么只记为什么?当什么不起什么作用时,什么不计算在内,编译器会把什么,什…...
Linux基础笔记总结
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
R语言学习笔记
1.R语言介绍 2.R语言安装 官网:https://www.r-project.org/ CARN → 选择China中任意镜像站点 → Download R for Windows → base(二进制版本R基础软件)→ Download R-4.2.2 for Windows (76 megabytes, 64 bit) 3.Rstudio安装 https://po…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
