一,概述    

     Dart是一种可选的类型语言。Dart中的集合默认是异构的。换句话说,单个Dart集合可以托管各种类型的值。但是,可以使Dart集合保持同质值。泛型的概念可以用来实现同样的目的。
  泛型的使用强制限制集合可以包含的值的数据类型。这种集合称为类型安全集合。类型安全是一种编程功能,可确保内存块只能包含特定数据类型的数据。
  所有Dart集合都通过泛型支持类型安全实现。包含数据类型的一对尖括号用于声明类型安全的集合。声明类型安全集合的语法如下所示。
    通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验)

二,语法

Collection_name <data_type> identifier= new Collection_name<data_type>

三,使用泛型的好处

  泛型是类型安全的(意思是你必须指定数据的类型),但是它的写法比硬编码指定类型高效的多:

  • 类型安全

    比如让数组只有String值,定义为List。这样,后续代码中,如果给数组赋值了非String类型,编译器将提示报错

    var names = List<String>();
    names.addAll(['Seth', 'Kathy', 'Lars']);
    names.add(42); // Error

  • 减少重复的代码  
    泛型让你通过一个单一类可以适配多种类型的数据操作,同时可以进行静态代码检查(比如,类型安全检查)。

    abstract class ObjectCache {Object getByKey(String key);void setByKey(String key, Object value);
    }

    上面代码是对Object类型操作,在没用泛型的情况下,你想对String类型操作,就得重新定义一个类

    abstract class StringCache {String getByKey(String key);void setByKey(String key, String value);
    }

    后面,你如果相对num类型操作,还得重新定义一个类。

    而泛型就可以解决上面的问题,它通过对类型参数化,实现一个类针对多种数据类型操作的适配。

    abstract class Cache<T> {T getByKey(String key);void setByKey(String key, T value);
    }

四,Dart泛型的使用

  • 使用集合

    List(通用列表)和map(通用映射)等字面量方式可以用指定类型参数。

    var names = <String>['Seth', 'Kathy', 'Lars'];
    var pages = <String, String>{'index.html': 'Homepage','robots.txt': 'Hints for web robots','humans.txt': 'We are people, not machines'
    };

    Set(通用集)和Queue(通用队列)等构造器方式可以用指定类型参数

    void main() { List <String> logTypes = new List <String>(); logTypes.add("WARNING"); logTypes.add("ERROR"); logTypes.add("INFO");// iterating across list for (String type in logTypes) { print(type); }
    }

    import 'dart:collection';
    void main() { Queue<int> queue = new Queue<int>(); print("Default implementation ${queue.runtimeType}"); queue.addLast(10); queue.addLast(20); queue.addLast(30); queue.addLast(40); queue.removeFirst();  for(int no in queue){ print(no); }
    }

  • Dart的泛型类型是在运行时绑定的,这样,在运行时,可以知道List内具体类型

    var names = List<String>();
    names.addAll(['Seth', 'Kathy', 'Lars']);
    print(names is List<String>); // true

    注意:java中,泛型是采用擦除的方式,它在运行时,其实对象都是Object类型或者泛型的约束父类。

  • 当泛型时,希望限制参数的类型范围,可以用extends关键字约束。
    class Foo<T extends SomeBaseClass> {// Implementation goes here...String toString() => "Instance of 'Foo<$T>'";
    }class Extender extends SomeBaseClass {...}

    添加约束后,只要是指定的父类或者其子类都可以作为泛型参数。

    var someBaseClassFoo = Foo<SomeBaseClass>();
    var extenderFoo = Foo<Extender>();

    也可以不指定泛型参数。

    var foo = Foo();
    print(foo); // Instance of 'Foo<SomeBaseClass>'

    不可以用限定范围的泛型参数,这样静态代码检查器将提示错误。

    var foo = Foo<Object>();

  • 泛型方法

    下面是允许使用泛型方法的场景:

    In the function’s return type (T).         //返回值
    In the type of an argument (List).        //参数
    In the type of a local variable (T tmp). //局部变量

    T first<T>(List<T> ts) {// Do some initial work or error checking, then...T tmp = ts[0];// Do some additional checking or processing...return tmp;
    }

  • Dart中泛型用法
    • 泛型方法的用法

      //分类实现:同时支持返回 string类型 和int类型  (代码冗余) String getData1(String value){    return value; }int getData2(int value){ return value;}//不确定类型:同时返回 string类型 和number类型  (放弃了类型检查) getData(value){ return value;}//泛系处理:比如:传入number 类型必须返回number类型  传入 string类型必须返回string类型(即减少了代码冗余,又可以检查类型)//返回T型T getData<T>(T value){  return value;}
      //无返回值getData<T>(T value){return value;}void main(){print(getData<int>(12));}

    • 泛型类的用法

      //案例:把下面类转换成泛型类,要求List里面可以增加int类型的数据,也可以增加String类型的数据。但是每次调用增加的类型要统一
      class PrintClass<T>{List list=new List<T>();void add(T value){this.list.add(value);}void printInfo(){          for(var i=0;i<this.list.length;i++){print(this.list[i]);}}}main() {  PrintClass p=new PrintClass<int>();p.add(12);p.add(23);p.printInfo();
      }

    • 泛型接口的用法

      /*
      Dart中的泛型接口:实现数据缓存的功能:有文件缓存、和内存缓存。内存缓存和文件缓存按照接口约束实现。1、定义一个泛型接口 约束实现它的子类必须有getByKey(key) 和 setByKey(key,value)2、要求setByKey的时候的value的类型和实例化子类的时候指定的类型一致
      */abstract class Cache<T>{getByKey(String key);void setByKey(String key, T value);
      }class FlieCache<T> implements Cache<T>{@overridegetByKey(String key) {    return null;}@overridevoid setByKey(String key, T value) {print("我是文件缓存 把key=${key}  value=${value}的数据写入到了文件中");}
      }class MemoryCache<T> implements Cache<T>{@overridegetByKey(String key) {   return null;}@overridevoid setByKey(String key, T value) {print("我是内存缓存 把key=${key}  value=${value} -写入到了内存中");}
      }
      void main(){MemoryCache m=new MemoryCache<Map>();m.setByKey('index', {"name":"张三","age":20});
      }

        

转载于:https://www.cnblogs.com/lxlx1798/p/11017768.html

【Dart学习】-- Dart之泛型相关推荐

  1. Flutter 学习 - Dart 语言基础

    文章目录 前言 一.Dart 概述 Dart 重要的概念 二.变量与基本数据类型 三.函数 四.运算符 五.流程控制语句 六.异常处理 七.面向对象 构造函数 继承类 抽象类 枚举类型 八.泛型 九. ...

  2. Dart学习笔记01:环境搭建与开发环境配置

    文章目录 一.Dart概述 二.下载Dart for Windows 三.安装Dart for Windows 四.命令行方式安装Dart (一)安装Chocolatey 1.启动PowerShell ...

  3. Dart入门—库、泛型与异常

    Dart入门-库.泛型与异常 库 Pub仓库 在Pub上可以下载到支持各种功能的包,首页在根目录下建立pubspec.yaml文件 name: test_app dependencies:sqljoc ...

  4. Dart学习3、数据类型详解

    常用数据类型 Numbers(数值) int double //Int 必须是整型 int a = 123; a = 456; //Double 既可以是整型,又可以是浮点型 double b = 1 ...

  5. Dart基础之Generics 泛型 <T>

    Java开发过程中,会通过重载实现根据不同的参数类型生成类似方法(多态),进一步可以通过 泛型 进一步提取基类方法:而对于 Dart 而言,为了解决多种方式构造对象的场景,也可以通过 Dart 中的 ...

  6. Dart 学习笔记一(操作符、方法与异常)

    目录 Dart变量 final和const修饰符 Dart的内置类型 numbers Strings Booleans Lists(列表) Maps(映射集合) Runes(用于在字符串中表示Unic ...

  7. 【dart学习】-- Dart之函数

    1. 指定返回值得函数 /** * 无返回值的函数 * params: 可以是任意类型(var和Object类型也可以任意类型). 当然这里的参数类型你可以随意指定我这里已dynamic为例 * 参数 ...

  8. flutter 应用场景_【Flutter 1-12】Flutter手把手教程Dart语言——什么是泛型和泛型的使用场景...

    泛型 如果你查看数组的API文档,你会发现数组List的实际类型为List.<> 符号表示数组是一个泛型(或参数化类型)通常使用一个字母来代表类型参数,比如E.T.S.K 和 V 等等. ...

  9. dart系列之:dart类中的泛型

    文章目录 简介 为什么要用泛型 怎么使用泛型 类型擦除 泛型的继承 泛型方法 总结 简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念.什么是泛型呢?泛型就是一种通用的类型格式,一般用在 ...

最新文章

  1. 15 -Flask构建弹幕微电影网站-基于角色的访问控制
  2. c语言smile定义函数,【C初始之习题五】
  3. 统计在从1到n的正整数中1出现的次数
  4. [转载] 大型网站的 HTTPS 实践(一)—— HTTPS 协议和原理
  5. PAT乙级(1030 完美数列)
  6. 苹果明年有望推出15英寸版MacBook Air
  7. php基础编程教程 pdf,手把手教你编程打印出PDF_PHP教程
  8. pageinfo对合并list进行分页_PageInfo实现分页
  9. 表迁移工具的选型-复制ibd的方法
  10. NGN学习笔记7——NGN的服务质量
  11. python嵌套字典的建立_python学习之第八篇——字典嵌套之字典中嵌套字典
  12. 系统账号自动退出时长哪里设置
  13. 优盘完整性测试软件,MyDiskTest(U盘扩容检测工具)
  14. 现代信号处理 张贤达_清华大学信号处理著名学者张贤达去世,享年74岁
  15. C++ Primer 第五版 课后章节练习答案 第九章
  16. 这5种数据挖掘技术,大数据玩的贼溜!
  17. Excel 怎么验证身份证号码是否重复
  18. android 优秀框架整理
  19. PostgreSQL使用PgAdmin导入数据
  20. 计算机多媒体对语文教学的提高,谈谈多媒体在语文教学中的运用(教师中心稿)...

热门文章

  1. php取整函数ceil,floor,round,intval函数的区别
  2. Java: String.split(....); 结果很意外
  3. Android开机广播和关机广播
  4. 复制GAC中的DLL
  5. 蓝桥杯第八届省赛JAVA真题----油漆面积
  6. Apache配置多个监听端口和访问网站的方法
  7. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
  8. 升级Python2.7后 no module name yum
  9. java oracle数据库连接代码,java连接oracle数据库代码实例(注释详解)
  10. python如何获取请求的url_听说你在学习:如何通过代码请求URL地址