dart系列之:dart类中的泛型
简介
熟悉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类中的泛型的更多相关文章
- dart系列之:dart语言中的特殊操作符
dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...
- dart系列之:dart类中的构造函数
目录 简介 传统的构造函数 命名构造函数 构造函数的执行顺序 重定向构造函数 Constant构造函数 工厂构造函数 总结 简介 dart作为一种面向对象的语言,class是必不可少的.dart中所有 ...
- dart系列之:dart语言中的内置类型
目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...
- dart系列之:dart类的扩展
目录 简介 使用extends 抽象类和接口 mixins 总结 简介 虽然dart中的类只能有一个父类,也就是单继承的,但是dart提供了mixin语法来绕过这样限制. 今天,和大家一起来探讨一下d ...
- dart系列之:dart代码最佳实践
目录 简介 命名规则 import中的顺序 格式化 总结 简介 每种语言都有自己的代码风格,这种代码风格是跟语言特性息息相关的.如果在编码的过程中遵循这种统一的编码规则,会给我们的业务带来非常多的便利 ...
- dart系列之:dart语言中的变量
目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...
- dart系列之:dart语言中的异常
目录 简介 Exception和Error Throw和catch Finally 总结 简介 Exception是程序中的异常情况,在JAVA中exception有checked Exception ...
- dart系列之:dart中的异步编程
目录 简介 为什么要用异步编程 怎么使用 Future 异步异常处理 在同步函数中调用异步函数 总结 简介 熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方 ...
- dart系列之:dart语言中的函数
目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函数有 ...
随机推荐
- Linux下iptables学习笔记
Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...
- MacOS下Java与JDK关系与相关路径
MacOS下Java与JDK关系与相关路径 macOS下的Java与JDK的路径曾经困扰过我一段时间,今天稍有些忘记,故记下笔记,整理一下.Java与JDK的关系不在本文笔记之内,Javaer常识. ...
- 利用caffe.proto生成caffe.pb.h
完全按照博文来就好了:http://blog.csdn.net/u012905422/article/details/52794693
- C++核心编程 4 类和对象-对象的初始化和清理
构造函数和析构函数 对象的初始化和清理工作是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用结果是未知的,同样,使用完一个对象或变量,没有及时清理,也会造成一定的安全问题.C++利用了构 ...
- NXOpen.CAM.CAMSetup.CopyObjects的使用
复制CAM对象 Public Function CopyObjects(ByVal view As NXOpen.CAM.CAMSetup.View, ByVal objectsToBeMoved() ...
- javascriptRemke之类的继承
前言:es6之前在js中要实现继承,就必须要我们程序员在原型链上手动继承多对象的操作,但是结果往往存在漏洞,为解决这些问题,社区中出现了盗用构造函数.组合继承.原型式继承.寄生式继承等一系列继承方式, ...
- 《看漫画学Pyhton》中计算水仙花数
利用while循环实现 i = 100 r = 0 s = 0 t = 0 while i < 1000: r = i // 100 s = (i - r * 100) // 10 t = i ...
- Linux信号处理编程
01. 学习目标 了解信号中的基本概念 熟练使用信号相关的函数 了解内核中的阻塞信号集和未决信号集作用 熟悉信号集操作相关函数 熟练使用信号捕捉函数signal 熟练使用信号捕捉函数sigaction ...
- Seata分布式事务失败通知
一.背景 在我们使用Seata作为分布式事务时,有些时候我们的分布式时候并不是每次都可以成功的,而对于这些失败的分布式事务就需要进行通知.这篇文章简单记录一下如何实现通知. 二.功能实现 此处模拟邮件 ...
- 将manjaro作为主力开发系统,我遇到了哪些坑。
首先遇到的问题就是企业微信. 最开始几天,我直接去安装企业微信和微信,安装全都报错了. 无奈之下,只好安装了virtual box,装了一个win7,可以正常使用微信,企业微信,最开始蛋疼的地方是,企 ...