Dart学习笔记(十八)

63 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

 

Dart 泛型 泛型方法

 

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

 

只能返回string类型的数据

 


 String getData(String value) {

 

   return value;

 

 }

同时支持返回string类型和int类型

 


 String getData1(String value) {

 

   return value;

 

 }

 

 int getData2(int value) {

 

   return value;

 

 }

同时支持返回string类型和int类型 不指定类型 放弃了类型检查

 


 getData(value) {

 

   return value;

 

 }

泛型方法 支持类型校验

 


T getData<T> (T value) {

 

  return value;

 

}

 

 

 

void main() {

 

  print(getData('你好'));

 

  print(getData(123));

 

  // 调用时指定类型

 

  print(getData<String>('你好'));

 

  print(getData<int>(456));

 

}

Dart 泛型 泛型类

集合List 泛型类的用法

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

只能传入指定类型的数据 并且可以检测类型

 


 class MyList {

 

   List list = <int>[];

 

   void add(int value) {

 

     this.list.add(value);

 

   }

 

   List getList() {

 

     return list;

 

   }

 

 }

可以传入任何类型的数据 并且可以检测类型

 


class MyList<T> {

 

  List list = <T>[];

 

  void add(T value) {

 

    this.list.add(value);

 

  }

 

 

 

  List getList() {

 

    return list;

 

  }

 

}

 

main() {

 

  MyList l = new MyList();

 

  l.add(1);

 

  l.add('你好');

 

  l.add(true);

 

  print(l.getList()); // [1, 你好, true]

 

 

 

  // 传入指定类型的数据

 

  MyList l2 = new MyList<String>();

 

  l2.add('你好2');

 

  print(l2.getList()); // [你好2]

 

}

Dart 泛型 泛型接口

Dart中的泛型接口:

 实现数据缓存的功能: 有文件缓存和内存缓存。文件缓存和内存缓存按照接口约束实现。

1.  定义一个泛型接口 约束实现它的子类必须有getByKey(key)和setByKey(key, value)

1.  要求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 FileCache<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}的数据写入到了内存中");

 

  }

 

}

 

 

 

main() {

 

  // MemoryCache m = new MemoryCache<String>();

 

  // m.setByKey('index', '首页数据'); // 我是内存缓存 把key=index value=首页数据的数据写入到了内存中

 

 

 

  MemoryCache m = new MemoryCache<Map>();

 

  m.setByKey('index', {"name": "张三", "age": 20}); // 我是内存缓存 把key=index value={name: 张三, age: 20}的数据写入到了内存中

 

}