写点什么

dart 系列之:dart 类中的泛型

作者:程序那些事
  • 2021 年 11 月 16 日
  • 本文字数:1335 字

    阅读完需:约 4 分钟

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/

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

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

发布于: 3 小时前阅读数: 6
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
dart系列之:dart类中的泛型