什么是泛型

泛型就是解决类、接口、方法的复用,以及对不特定数据类型的校验。

  1. void main() {
  2. /*
  3. 泛型类
  4. 如果想让 List 仅仅支持字符串类型,可以将其声明为 List<String> (读作“字符串类型的 list”)
  5. 那么,当一个非字符串被赋值给了这个 list 时,开发工具就能检测到这样的做法可能存在错误。
  6. */
  7. // 系统自带的泛型类
  8. var names = new List<String>();
  9. names.add("zhangsan")
  10. var maps = new Map<int, String>();
  11. maps[1]="value";
  12. //泛型的字面量
  13. var infos = <String>['Seth', 'Kathy', 'Lars'];
  14. var pages = <String, String>{
  15. 'index.html': 'Homepage',
  16. 'robots.txt': 'Hints for web robots'
  17. };
  18. }

自己封装的泛型类

无法定义类型

  1. class Demo {
  2. var name;
  3. show(a) {
  4. print(a);
  5. }
  6. }
  7. void main() {
  8. var d1 = Demo();
  9. d1.show(2);
  10. d1.show('a');
  11. }

固定数据类型,并校验

  1. class Demo<T> {
  2. var name;
  3. show(T a) {
  4. print(a);
  5. }
  6. }
  7. void main() {
  8. // 把 T 定义成 String
  9. var d1 = Demo<String>();
  10. d1.show('a'); //'a'
  11. // d1.show(2); //报错
  12. // 把 T 定义成 int
  13. var d2 = Demo<int>();
  14. d2.show(2); //2
  15. // d2.show('a'); //报错
  16. }

泛型方法

  1. void main() {
  2. // 泛型方法,我想传入什么数据类型,就返回什么数据类型
  3. // 都来一遍,那么多,肯定不行
  4. // String show(String name){}
  5. // int show(int name){}
  6. // 这样也不行,无法教养约束类型
  7. // show(name){}
  8. T show<T>(T a) {
  9. return a;
  10. }
  11. print(show(1)); //1
  12. print(show<String>('a')); //a
  13. print(show<int>(1)); //1
  14. }

接口

  1. // 泛型的接口
  2. abstract class DataForm<T> {
  3. T name;
  4. add(T);
  5. }

为什么使用泛型

在类型安全上通常需要泛型支持,它的好处不仅仅是保证代码的正常运行,
正确指定泛型类型可以提高代码质量。
使用泛型可以减少重复的代码。