Flutter/Dart - 泛型

2020-07-13  本文已影响0人  沫之

泛型的定义

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

接下来我们实现一个方法 传入什么,返回什么。

T getData<T>(T value){
  return value;
} 

main(){
  print(getData<Int>(22))
  print(getData<String>('XXX'))

}

泛型类

集合list 就是泛型类的用法

main(){
    List list = new List<String>();
    list.add(12)//错误的写法
    list.add('12')
}

把下面类转换成泛型类,要求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]);
    }
  }
}

转换为:

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(1);
  p.add('12');
  p.printInfo(); 

  PrintClass p2 = new PrintClass<int>();
  p2.add(1);
  p2.printInfo(); 

  PrintClass p3 = new PrintClass<int>();
  p3.add('23');
  p3.printInfo(); 
}

泛型接口

官方文档示例

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

abstract class StringCache {
  getByKey(String key);
  void setByKey(String key, Object 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}写到内存中');
  }
}
void main() {
  MemoryCache m = new MemoryCache<String>();
  // m.setByKey('index', 123);//会报错,因为这里创建类时定义为String类型
  m.setByKey('index', '123'); //正常输出

  MemoryCache m2 = new MemoryCache<Map>();
  // m.setByKey('index', 123);//会报错,因为这里创建类时定义为String类型
  m.setByKey('index', {'name': 'hhh', 'age': 20}); //正常输出
}
上一篇 下一篇

猜你喜欢

热点阅读