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

强类型语言的一种补偿措施。

一、泛型方法

  1. T getData<T>(T value) {
  2. return value;
  3. }
  4. void main() {
  5. print(getData('没有类型校验'));
  6. print(getData<String>('调用的时候动态传入泛型的类型,起到类型约束'));
  7. print(getData<int>(123));
  8. }

二、泛型类

内置类

  1. Set<String> s1 = new Set();// √
  2. Set s2 = new Set<String>();// × -- 无静态检查
  3. Set<String> s3 = new Set<String>();// 不推荐 -- 繁琐
  4. s1.add('仅支持字符串');
  5. s2.add(1111);// 运行时会报错,但没有静态检查
  6. s3.add('仅支持字符串');

自定义类

  1. class MySet<T> {
  2. Set<T> s1 = new Set();
  3. void add(T value)=>this.s1.add(value);
  4. void printAll() {
  5. s1.forEach((element)=> print(element));
  6. }
  7. }
  8. void main() {
  9. MySet<int> ms1 = new MySet();
  10. ms1.add(11);
  11. ms1.add(22);
  12. ms1.printAll();
  13. }

三、泛型接口

  1. abstract class Cache<T> {
  2. Map<String, T> store = new Map();
  3. getByKey(String key);
  4. void setByKey(String key, T value);
  5. }
  6. class MemoryCache<T> implements Cache<T> {
  7. @override
  8. Map<String, T> store = new Map();
  9. @override
  10. T? getByKey(String key) {
  11. return store[key] ?? null;
  12. }
  13. @override
  14. void setByKey(String key, T value) {
  15. store[key] = value;
  16. }
  17. }
  18. void main() {
  19. MemoryCache<String> mc1 = new MemoryCache();
  20. mc1.setByKey('hobby', 'play');
  21. print(mc1.getByKey('hobby'));
  22. print(mc1.store);
  23. }