简介
相熟 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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!