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

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 文档&#xff0c;您会发现该类型实际上是 List<E>。 <…> 表示法将 List 标记为泛型&#xff08;或参数化&#xff09;类型——具有正式类型参数的类型。 按照惯例&#xff0c;大多数类型变量的名称都是单字母的&#xff0…...

rt-thread------串口(一)配置

系列文章目录 rt-thread 之 fal移植 rt-thread 之 生成工程模板 文章目录系列文章目录前言一、串口的配置step1&#xff1a;通过串口名字找到串口句柄step2&#xff1a;配置串口参数step3&#xff1a;设置串口接收回调函数step4&#xff1a;打开串口设备前言 UART&#xff08…...

Android - 自动系统签名

一、系统签名 以下是两类应用开发场景&#xff1a; 普通应用开发&#xff1a;使用公司自定义 keystore 进行签名&#xff0c;如&#xff1a;微信、支付宝系统应用开发&#xff1a;使用 AOSP 系统签名或厂商自定义 keystore 进行签名&#xff0c;如&#xff1a;设置、录音 系…...

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 生成输入信号 在汽车的电控软件开发中&#xff0c;经常会在Simulink模型内部进行单元测试。单元测试的本…...

云计算培训靠谱吗?

怎么算靠谱的培训呢&#xff1f; 举个例子&#xff1a; 我想参加云计算培训找个工作&#xff0c;机构满足了我的要求&#xff0c;有工作了&#xff0c;但是不是做云计算相关的。 小强也参加了云计算培训&#xff0c;想学好云计算成为技术大牛&#xff0c;最后专业学得普普通…...

力扣SQL刷题10

目录标题618. 学生地理信息报告--完全不会的新题型1097. 游戏玩法分析 V - 重难点1127. 用户购买平台--难且不会618. 学生地理信息报告–完全不会的新题型 max()函数的功效&#xff1a;&#xff08;‘jack’, null, null&#xff09;中得出‘jack’&#xff0c;&#xff08;nul…...

31 岁生日快乐,Linux!

Linux 迎来了 31 岁生日&#xff0c;所以和我一起庆祝 Linux 的 31 岁生日吧&#xff0c;喝上一杯好香槟和一个美味的蛋糕&#xff01;虽然有些人不承认 8 月 25 日是 Linux 的生日&#xff0c;但我知道。1991 年 8 月 25 日&#xff0c;21 岁的芬兰学生 Linus Benedict Torval…...

分布式ID生成方案

文章目录前言一、分布式ID需要满足的条件二、分布式ID生成方式基于UUID数据库自增数据库集群数据库号段模式redis ID生成基于雪花算法&#xff08;Snowflake&#xff09;模式百度&#xff08;uid-generator&#xff09;美团&#xff08;Leaf&#xff09;滴滴&#xff08;Tinyid…...

合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库

基础资料 基于Air103开发板&#xff1a;&#x1f697; Air103 - LuatOS 文档 上手&#xff1a;开发上手 - LuatOS 文档 探讨重点 对官方社区库接口类redis的fbd数据库及fskv库的调用及示例进行复现及分析&#xff0c;了解两库的基本原理及操作方法。 软件及工具版本 Luat…...

【论文精读】Deep Residual Learning for Image Recognition

1 Degradation Problem&#x1f4a6; 深度卷积神经网络在图像分类方面取得了一系列突破。深度网络自然地将低/中/高级特征和分类器以端到端的多层方式集成在一起&#xff0c;特征的“层次”可以通过堆叠层数(深度)来丰富。最近的研究揭示了网络深度是至关重要的&#xff0c;在具…...

Lesson2:基础语法、输出输入

一、基础语法 1、行结构 一个Python程序可分为许多逻辑行&#xff0c;一般来说&#xff1a;一个语句就是一行代码&#xff0c;不会跨越多行。 """比如下面的Python程序&#xff0c;一共有3个逻辑行&#xff0c;每一行都通过print()输出一个结果。""…...

android 9.0去掉前置摄像头闪光灯功能

1.1概述 在9.0的系统rom定制化开发中,在系统中camera2也是非常重要的一部分功能,在很多场合会用到camera2拍照视频,等等功能, 但是在使用过程中发现系统camera2在使用的时候,在前置摄像头进行拍照的时候,会出现闪光灯的情况,对于产品来说,者就是一个大问题,所以产品要求…...

静态分析工具Cppcheck在Windows上的使用

之前在https://blog.csdn.net/fengbingchun/article/details/8887843 介绍过Cppcheck&#xff0c;那时还是1.x版本&#xff0c;现在已到2.x版本&#xff0c;这里再总结下。 Cppcheck是一个用于C/C代码的静态分析工具&#xff0c;源码地址为https://github.com/danmar/cppcheck …...

用一年时间脱胎换骨

生活习惯篇早睡早起11点30之前必须睡觉按时吃饭特别是早餐控糖&#xff0c;少吃甜食早起刷牙后&#xff0c;喝一杯温水保持身材&#xff0c;养成运动健身的习惯养成持续写作的习惯记录选题&#xff0c;金句&#xff0c;素材断舍离&#xff0c;定期整理&#xff0c;把不用的东西…...

全景拼接python旗舰版

前言在这个项目中&#xff0c;您将构建一个管道&#xff0c;将几幅图像拼接成一个全景图。您还将捕获一组您自己的图像来报告最终的结果。步骤1 特征检测与描述本项目的第一步是对序列中的每幅图像分别进行特征检测。回想一下我们在这个类中介绍过的一些特征探测器&#xff1a;…...

(C语言)常见的字符串与内存操作函数

问&#xff1a;1. Solve the problems&#xff1a;我想用三种方法求字符串的长度怎么办&#xff1f;2. strlen处理的字符串中有什么时需要注意&#xff1a;什么只记为什么&#xff1f;当什么不起什么作用时&#xff0c;什么不计算在内&#xff0c;编译器会把什么&#xff0c;什…...

Linux基础笔记总结

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

R语言学习笔记

1.R语言介绍 2.R语言安装 官网&#xff1a;https://www.r-project.org/ CARN → 选择China中任意镜像站点 → Download R for Windows → base&#xff08;二进制版本R基础软件&#xff09;→ Download R-4.2.2 for Windows (76 megabytes, 64 bit) 3.Rstudio安装 https://po…...

【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、自我介绍 您好&a…...

《Spring源码深度分析》第8章 数据库连接JDBC

目录标题前言一、数据库连接方式1.JDBC连接数据库2.Spring Jdbc连接数据库(JdbcTemplate)二、JdbcTemplate源码分析1.update/save功能的实现源码分析入口(关键)基础方法execute1.获取数据库连接池2.应用用户设定的输入参数3. 调用回调函数处理4. 资源释放Update中的回调函数2.q…...

ModuleNotFoundError的解决方案【已解决】

问题描述 有包却提示ModuleNotFoundError 在正常情况下&#xff0c;你使用pip或者conda检查是否有相应包的时候&#xff0c;显示的是有的。但是一旦运行程序就会报这个ModuleNotFoundError错误。 问题可能是程序运行环境不对。 解决方案 &#xff08;1&#xff09;进入正确…...

Vue驼峰与短横线分割命名中有哪些坑

目录 0.前言 驼峰和短横线分割命名注意事项 组件注册命名 父子组件数据传递时命名 父子组件函数传递 0.前言 Vue驼峰命名法指的是将变量以驼峰形式命名&#xff0c;例如 userName、userId 等&#xff0c;而短横线分隔符法则指的是用短横线分隔变量名&#xff0c;例如 user…...

从文件中加载数据以及异常处理

上期学习了数据的存储&#xff0c;这次学习数据的加载 你可以使用把openpyxl.load_workbook() 来打开一个已经存在的工作簿 >>> from openpyxl import load_workbook >>> wb load_workbook(filename empty_book.xlsx) >>> sheet_ranges wb[ran…...

【JavaSE】方法的使用

方法的使用BIT-5-方法的使用绪论1. 方法概念及使用1.1什么是方法1.2 方法定义1.3 实参和形参的关系&#xff08;重要&#xff09;1.4 没有返回值的方法2. 方法重载2.1 为什么需要方法重载2.2 方法重载概念3. 递归3.1 生活中的故事3.2 递归的概念3.2 递归执行过程分析3.3 递归练…...

ModelScope 垂类检测系列模型介绍

文章目录ModelScope介绍垂类模型介绍调用方式1 Demo Service2 Notebook3 本地使用* 二次开发总结ModelScope介绍 ModelScope 是阿里达摩院推出的 中文版模型即服务&#xff08;MaaS, Model as a Service&#xff09;共享平台。该平台在2022年的云栖大会上发布&#xff0c;之前…...

Linux | Linux卸载和安装MySQL(Ubuntu版)

最近又来到了Linux学习了&#xff0c;原因是要接触云服务器相关知识&#xff0c; 所以博主整理了一些关于Linux的知识&#xff0c; 欢迎各位朋友点赞收藏&#xff0c;天天开心丫&#xff0c;快乐写代码&#xff01; Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…...

【C1】数据类型,常量变量,输入输出,运算符,if/switch/循环,/数组,指针,/结构体,文件操作,/编译预处理,gdb,makefile,线程

文章目录1.数据类型&#xff1a;单双引号&#xff0c;char&#xff08;1B&#xff09;&#xff0c;int/float&#xff08;32位系统&#xff0c;大小一样4B&#xff0c;但存储方式不同&#xff09;&#xff0c;double&#xff08;8B&#xff09;&#xff0c;long double&#xf…...

【深度学习】pytorch的基础操作

import torch import numpy as np # 1.1 根据已有的数据创建张量 def test01(): # 1.1 创建标量 data torch.tensor(10) print(data) # 1.2 使用numpy数组来创建张量 data np.random.randn(2,3) data torch.tensor(data) print(data) # 1.3使用list…...

做棋牌开发的网站/seo推广系统排名榜

M A T LAB直接转矩控制开关状态的选择实现苗敬利1 刘增环1 马文辉21.河北工程学院2.河北邯郸市农业学校摘要:详细论述了开关状态选择的基本原理,给出了一种基于M ATLAB的SIM U LINK环境下的开关状态选择的实现方法,并给出了仿真结果。关键词:开关状态选择 M ATLAB 仿真 直…...

网站建设提成/电商培训心得

一、阿里云私有docker仓库管理指南 登录阿里云Docker Registry $ sudo docker login --username白衣卿相2744 registry.cn-shanghai.aliyuncs.com用于登录的用户名为阿里云账号全名   密码为开通服务时设置的密码**&#xff08;点击查看&#xff09;**   您可以在访问凭证…...

家在深圳论坛业主论坛/廊坊seo网站管理

在做多语言版本的时候&#xff0c;日期时间的格式话是一个很头疼的事情&#xff0c;幸好Android提供了DateFormate&#xff0c;可以根据指定的语言区域的默认格式来格式化。直接贴代码&#xff1a; public static CharSequence formatTimeInListForOverSeaUser( final Context …...

做网站的图片字虚/互联网平台推广怎么做

以下是我所知道的两种最简单的筑墙方法。这两种方法都适用于图结构和图搜索算法&#xff0c;因此如果您愿意&#xff0c;可以在将来实现“路径查找”。这都是我的头顶&#xff0c;所以我很抱歉&#xff0c;如果有任何不清楚&#xff0c;但我也提供了相关文件的链接&#xff0c;…...

大学网站建设目标/百度联盟推广

ffmpeg.exe -i F:\闪客之家\闪客之歌.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\11.flv ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv 使用-ss参数 作用&#xff08;time_off set the start time offset&#xff09;&#xff0c;可以从指…...

怎么做动态的实时更新的网站/免费平台

1. 基本语法test condition或[ condition ]使用括号方式时&#xff0c;条件与括号之间要加空格。2. 测试文件状态例&#xff1a;测试文件 scores.txe 是否可执行。 [rootlocalhost ~]# [ -x scores.txt ] [rootlocalhost ~]# echo $? 1 条件测试可以使用以下条件表达…...