文章

泛型-泛型方法_泛型类_泛型接口

泛型-泛型方法/泛型类/泛型接口

泛型-泛型方法_泛型类_泛型接口

泛型-泛型方法/泛型类/泛型接口

泛型方法

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
T getData<T>(T value) {
  return value;
}

void main() {
  print(getData(123)); // 123
  print(getData('xxx')); // xxx

  var str = getData<String>('hello');
  print(str); // hello

  var num = getData<int>(123);
  print(num); // 23
}

泛型类

以下代码只能实现增加 int 类型的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyList {
  List list = <int>[];
  
  void add(int value) {
    this.list.add(value);
  }

  List getList() {
    return list;
  }
}

void main() {
  // new 关键字可以省略
  MyList l = new MyList();
  l.add(1);
  l.add(2);
  print(l.getList()); // [1, 2]
}

可以增加任意类型的数据 - 但是每次调用增加的类型要统一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyList<T> {
  List list = <T>[];
  
  void add(T value) {
    this.list.add(value);
  }

  List getList() {
    return list;
  }
}

void main() {
  // new 关键字可以省略
  MyList l = MyList();
  l.add(1);
  l.add('张三');
  l.add(true);
  print(l.getList()); // [1, 张三, true]
}

实例话泛型类的时候 指定传入类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyList<T> {
  List list = <T>[];
  
  void add(T value) {
    this.list.add(value);
  }

  List getList() {
    return list;
  }
}

void main() {
  // 指定传入类型
  MyList l = MyList<String>();
  // 报错
  // l.add(1);
  l.add('张三');
  print(l.getList()); // [张三]
}

泛型接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
}

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

  1. 定义一个泛型接口约束实现它的子类必须有getByKey(key) 和 setByKey(key, value)
  2. 要求setByKey时候的value的类型和实例话子类的时候指定的类型一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
abstract class Cache<T> {
  getByKey(String key);
  void setByKey(String key, T value);
}

class FileCache<T> implements Cache{ 
  @override
  getByKey(String key) {
    
  }
  
  @override
  void setByKey(String key, T value) {
     print('我是文件缓存 数据:key=${key} value=${value}');
  }
}

class MemoryCache<T> implements Cache{ 
  @override
  getByKey(String key) {
    
  }
  
  @override
  void setByKey(String key, T value) {
    print('我是内存缓存 数据:key=${key} value=${value}');
  }
}

void main() {
  MemoryCache m = new MemoryCache<String>();
  m.setByKey('key1', 'hello');
}
本文由作者按照 CC BY 4.0 进行授权