Dart 学习笔记 (八) 泛型

121 阅读1分钟

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

泛型方法

不指定类型放弃了类型检查。我们现在想实现的是传入什么 返回什么。比如:传入number 类型必须返回number类型 , 传入string类型必须返回string类型

//- 即对传入的参数有类型的校验也对返回的参数有类型的校验
T getData<T>(T value) {
  print(value);
  return value;
}

//- 对传入的参数有类型的校验,但是对返回的参数没有类型的校验
getData<T>(T value) {
  print(value);
  return value;
}

void main() {
  //- 这两种调用没有类型检测
  // getData(21);
  // getData("hello");
  //- 有类型检测
  getData<String>('你好'); //- 传入的参数是字符串,返回的参数也是字符串
  getData<int>(20); //- 传入的参数是数字,返回的参数也是数字
}

泛型类

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("张三");
  l.add(12);
  l.add(true);
  print(l.getList());
  
  MyList l2 = new MyList<String>(); //- 实例化时指定类型
  l2.add("张三");
  print(l2.getList());
}

泛型接口

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> {
  @override
  getByKey(String key) {
    return key;
  }

  @override
  void setByKey(String key, T value) {
    print("key=$key value=$value");
  }
}

main() {
  FlieCache f = new FlieCache<String>();
  f.setByKey("index", "hello");
}