/*

通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验)

*/

//只能返回string类型的数据

  // String getData(String value){
// return value;
// } //同时支持返回 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 getData<T>(T value){
// return value;
// } getData<T>(T value){
return value;
} void main(){ // print(getData(21)); // print(getData('xxx')); // getData<String>('你好'); print(getData<int>(12)); }
//集合List 泛型类的用法

//案例:把下面类转换成泛型类,要求List里面可以增加int类型的数据,也可以增加String类型的数据。但是每次调用增加的类型要统一

//  class PrintClass{
// List list=new List<int>();
// void add(int value){
// this.list.add(value);
// }
// void printInfo(){
// for(var i=0;i<this.list.length;i++){
// print(this.list[i]);
// }
// }
// } // PrintClass p=new PrintClass();
// p.add(1);
// p.add(12);
// p.add(5);
// p.printInfo(); 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();
// p.add(11);
// p.add('xxx');
// p.add(5);
// p.printInfo(); // PrintClass p=new PrintClass<String>(); // p.add('你好'); // p.add('哈哈'); // p.printInfo(); PrintClass p=new PrintClass<int>(); p.add(12); p.add(23); p.printInfo(); // List list=new List();
// list.add(12);
// list.add("你好");
// print(list); // List list=new List<String>(); // // list.add(12); //错误的写法 // list.add('你好');
// list.add('你好1'); // print(list); // List list=new List<int>(); // // list.add("你好"); //错误写法
// list.add(12); // print(list); }
/*
Dart中的泛型接口: 实现数据缓存的功能:有文件缓存、和内存缓存。内存缓存和文件缓存按照接口约束实现。
1、定义一个泛型接口 约束实现它的子类必须有getByKey(key) 和 setByKey(key,value)
2、要求setByKey的时候的value的类型和实例化子类的时候指定的类型一致 */ // abstract class ObjectCache {
// getByKey(String key);
// void setByKey(String key, Object value);
// } // abstract class StringCache {
// getByKey(String key);
// void setByKey(String key, String value);
// } // abstract class Cache<T> {
// getByKey(String key);
// void setByKey(String key, T value);
// } abstract class Cache<T>{
getByKey(String key);
void setByKey(String key, T value);
} class FlieCache<T> implements Cache<T>{
@override
getByKey(String key) {
return null;
} @override
void setByKey(String key, T value) {
print("我是文件缓存 把key=${key} value=${value}的数据写入到了文件中");
}
} class MemoryCache<T> implements Cache<T>{
@override
getByKey(String key) {
return null;
} @override
void setByKey(String key, T value) {
print("我是内存缓存 把key=${key} value=${value} -写入到了内存中");
}
}
void main(){ // MemoryCache m=new MemoryCache<String>(); // m.setByKey('index', '首页数据'); MemoryCache m=new MemoryCache<Map>(); m.setByKey('index', {"name":"张三","age":20});
}

Dart泛型的更多相关文章

  1. Dart语言学习(十四) Dart泛型

    什么是泛型? 通俗理解:泛型就是解决 类 接口 方法的复用性.以及对不特定数据类型的支持(类型校验) 如下代码,只能返回string类型的数据 String getData(String value) ...

  2. 【Dart学习】-- Dart之泛型

    一,概述  Dart是一种可选的类型语言.Dart中的集合默认是异构的.换句话说,单个Dart集合可以托管各种类型的值.但是,可以使Dart集合保持同质值.泛型的概念可以用来实现同样的目的. 泛型的使 ...

  3. Dart Generic All In One

    Dart Generic All In One Dart 泛型 https://dart.dev/guides/language/language-tour#generics /** * * @aut ...

  4. 8.Generics 泛型(Dart中文文档)

    这篇翻译的不好 如果你看API文档中的数组篇,你会发现类型一般写成List.<...>的写法表示通用类型的数组(未明确指定数组中的数据类型).通常情况泛型类型用E,T,S,K,V表示. W ...

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

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

  6. Dart语法基础

    hello world // Define a function. printNumber(num aNumber) { print('The number is $aNumber.'); // Pr ...

  7. [Dart]语法基础

    此页面向您展示如何使用每个主要Dart功能,从变量和运算符到类和库,假设您已经知道如何使用其他语言编程. 要了解有关Dart核心库的更多信息,请参阅 Dart Libraries之旅.无论何时需要有关 ...

  8. Dart 语言了解

    Dart 语言了解 概念 当您了解Dart语言时,请记住以下事实和概念: 您可以放在变量中的所有内容都是一个对象,每个对象都是一个类的实例.偶数,函数和 null对象.所有对象都从Object类继承. ...

  9. 30分钟掌握Dart语言

    在Dart中,一切都是对象,一切对象都是class的实例,哪怕是数字类型.方法甚至null都是对象,所有的对象都是继承自Object 虽然Dart是强类型语言,但变量类型是可选的因为Dart可以自动推 ...

随机推荐

  1. mysql开发相关

    1.mysql事务原理,特性,事务并发控制2.如何解决高并发场景下的插入重复3.乐观锁和悲观锁4.常用数据库引擎之间区别5.mysql索引6.B-Tree7.mysql索引类型8.什么时候创建索引9. ...

  2. mysql-proxy读写分离笔记

    1.MySQL的安装与配置 --省略 版本:Server version: 5.6.35 1.1 系统版本: [root@centos7-67 package]# lsb_release -a LSB ...

  3. LINQ查询表达式(2) - 在 C# 中编写 LINQ 查询

    在 C# 中编写 LINQ 查询 C# 中编写 LINQ 查询的三种方式: 使用查询语法. 使用方法语法. 组合使用查询语法和方法语法. // 查询语法 IEnumerable<int> ...

  4. DTCMS

    DTCMS数据表: http://www.cnblogs.com/hifor/p/4560882.html DTCMS系统框架: http://www.cnblogs.com/hifor/p/4561 ...

  5. js中number常用方法

    toFixed() 将数字四舍五入为指定小数位数的数字,参数值范围为[0,20],表示四舍五入后保留的小数位数,如果没有传入参数,默认参数值等于整数,没有小数点. toprecision():用于将数 ...

  6. Django --- ORM表查询

    目录 使用数据库之前的配置工作 单表操作常用的方法 一对多字段的增删改查 多对多字段数据的增删改查 跨表查询 聚合函数 分组查询 F与Q查询 使用数据库之前的配置工作 settings.py中的配置 ...

  7. java之比较器

    java中的比较器有两种: 1.实体类实现Comparable接口,并实现其中的compareTo方法 2.在外部定义实现Comparator接口的比较器类,并实现其中的compare方法 Compa ...

  8. python3文本读取与写入常用代码

    创建文件夹: import os import shutil def buildfile(echkeyfile): if os.path.exists(echkeyfile): #创建前先判断是否存在 ...

  9. MySQL 必会知识

    一.为什么用自增列作为主键 1.如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引. 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为 ...

  10. 获取上一个页面的data

    let pages = getCurrentPages();// 获取页面栈 let current = pages[pages.length - 1]; // 当前页面 let url = curr ...