关于dart:dart系列之dart类中的泛型

2次阅读

共计 1724 个字符,预计需要花费 5 分钟才能阅读完成。

简介

相熟 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<String> 来说,JAVA 在运行时,只能判断对象是不是 List,而不能判断对象是不是 List<String>。

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

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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

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

正文完
 0