简介

熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念。什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合中,用来指定该集合中应该存储的对象格式。

有了泛型可以简化我们的编程,并且可以减少错误的产生,非常的方便。

dart语言中也有泛型。一起来看看吧。

为什么要用泛型

使用泛型的主要目的是保证类型安全,比如我们有一个List,然后只希望List中保存String类型,那么在dart中可以这样指定:

var stringList = <String>[];
stringList.addAll(['jack ma', 'tony ma']);
stringList.add(18); // 报错

那么在使用的过程中,只能向stringList中添加字符串,如果向其添加数字,则会报错,从而保证List中类型的一致性。

巧妙的使用泛型还能够减少我们的代码量,因为泛型可以代表一类通用的类型。

比如,在学校中,我们有寝室,寝室是有男女之分的,那么对应男生来说有这样的定义:

abstract class BoyRoom {
Boy getByName(String name);
}

对于女生来说有这样的定义:

abstract class GirlRoom{
Girl getByname(String name);
}

事实上,两者本质上没太大区别,只是参数或者返回值的类型发生了变化,那么我们可以这样写:

abstract class Room<T>{
T getByname(String name);
}

从而简化了代码的使用。

怎么使用泛型

泛型一般使用大写的单个字符来表示,通常来说是E, T, S, K 和 V等。

泛型最常见的使用地方是集合中,比如List, set 和 map中:

var listExample = <String>['jack ma', 'tony ma'];
var setExamples = <String>{'jack ma', 'tony ma'};
var mapExamples = <String, String>{
'name1': 'jack ma',
'name2': 'tony ma',
};

泛型还可以用在这些集合类的构造函数中,如下:

var stringMap = Map<String, String>();

表示构造出来的集合中,应该包含对应的类型。

类型擦除

虽然JAVA中也有泛型,但是JAVA中的泛型有一个类型擦除的特点。什么时候类型擦除呢?类型擦除就是指泛型指定的类型,只在编译的时候生效,而在运行时是没有泛型的概念的。

对于一个List 来说,JAVA在运行时,只能判断对象是不是List,而不能判断对象是不是List。

dart就和java不一样了,dart在运行时能够携带类型信息,也就是说,在dart中可以判断一个对象是不是List。

var stringList = <String>[];
stringList.addAll(['jack ma', 'tony ma']);
print(names is List<String>); // true

泛型的继承

使用泛型的目的是限制参数的类型,所以我们通常会指定泛型的父类,以限制泛型的类型范围:

class Room<T extends Student> {

}

class Boy extends Student {...}

在使用的过程中,可以传入Student本身,也可以传入Student的子类Boy,还可以不传:

var student = Room<Student>();
var boy = Room<Boy>();
var studentDefault = Room();

泛型方法

dart中的泛型除了可以用在class中以外,还可以用在方法中:

T doSomething<T>(List<T> list) {
T result = list[0];
return result;
}

方法中指定的泛型可以用在返回类型、参数和方法中的本地变量类型中。

总结

以上就是dart中泛型和其使用的介绍。

本文已收录于 http://www.flydean.com/08-dart-generics/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

dart系列之:dart类中的泛型的更多相关文章

  1. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...

  2. dart系列之:dart类中的构造函数

    目录 简介 传统的构造函数 命名构造函数 构造函数的执行顺序 重定向构造函数 Constant构造函数 工厂构造函数 总结 简介 dart作为一种面向对象的语言,class是必不可少的.dart中所有 ...

  3. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  4. dart系列之:dart类的扩展

    目录 简介 使用extends 抽象类和接口 mixins 总结 简介 虽然dart中的类只能有一个父类,也就是单继承的,但是dart提供了mixin语法来绕过这样限制. 今天,和大家一起来探讨一下d ...

  5. dart系列之:dart代码最佳实践

    目录 简介 命名规则 import中的顺序 格式化 总结 简介 每种语言都有自己的代码风格,这种代码风格是跟语言特性息息相关的.如果在编码的过程中遵循这种统一的编码规则,会给我们的业务带来非常多的便利 ...

  6. dart系列之:dart语言中的变量

    目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...

  7. dart系列之:dart语言中的异常

    目录 简介 Exception和Error Throw和catch Finally 总结 简介 Exception是程序中的异常情况,在JAVA中exception有checked Exception ...

  8. dart系列之:dart中的异步编程

    目录 简介 为什么要用异步编程 怎么使用 Future 异步异常处理 在同步函数中调用异步函数 总结 简介 熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方 ...

  9. dart系列之:dart语言中的函数

    目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函数有 ...

随机推荐

  1. SSA

    wikipedia上关于SSA的定义如下: In compiler design, static single assignment form (often abbreviated as SSA fo ...

  2. 阿里:MySQL数据库规范

    阿里:MySQL数据库规范 简介:基于阿里数据库设计规范扩展而来 设计规范 1.[推荐]字段允许适当冗余,以提高查询性能,但必须考虑数据一致.冗余字段应遵循: 不是频繁修改的字段. 不是 varcha ...

  3. Android12系统源码分析:NativeTombstoneManager

    Android12系统源码分析:NativeTombstoneManager 概述 android12新增的system_server进程(LocalService)本地服务,用于管理native t ...

  4. 浅析InnoDB引擎的索引和索引原理

    浅析InnoDB引擎的索引和索引原理 什么是InnoDB的索引 InnoDB的索引就是一颗B+树.页是InnoDB引擎在内存和磁盘之间交换数据的基本单位,页的大小一般是16KB,页的大小可以在启动My ...

  5. Spirit带你了解如何安全引入第三方资源

    Spirit带你了解如何安全的引入第三方资源 本文介绍一下如何安全的引入第三方资源 同源策略(SOP) 首先我们来了解一下什么是同源策略,下面的是wiki百科的定义 同源策略是指Web浏览器中,允许某 ...

  6. 第十一章 Dockerfile安装Jenkins-2.249.3-1.1

    一.安装Docker Docker部署Jenkins前提已经安装Docker,这边脚本安装Docker. #1.编写Docker安装脚本 [root@ip-10-0-12-212 ~]# vim In ...

  7. 利用 CSS Overview 面板重构优化你的网站

    本文将向大家介绍 Chrome 87 开始支持的 CSS Overview Panel,并且介绍如何更好地利用这个面板.通过 CSS Overview Panel,可能可以帮助我们: 更准确(高保真) ...

  8. Python在Linux下编译安装报错:Makefile:1141:install

    正常情况下执行:./configuremake && make install可以直接安装python,但是在在更新了乌版图后居然报错了!!!检查了一圈,发现乌版图安装了python3 ...

  9. Spring Cloud Gateway GatewayFilter的使用

    Spring Cloud Gateway GatewayFilter的使用 一.GatewayFilter的作用 二.Spring Cloud Gateway内置的 GatewayFilter 1.A ...

  10. Spring Security Jwt Token 自动刷新

    token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...