泛型方法

  1. T getData<T> (T val) {
  2. return val;
  3. }
  4. getData<String>('123');
  5. getData<int>(123);
  6. getData<double>(123);
  7. // getData<bool>(123); // Error: The argument type 'int' can't be assigned to the parameter type 'bool'.

泛型类

声明泛型类,比如声明一个 Array 类,实际上就是 List 的别名,而 List 本身也支持泛型的实现。

  1. class Array<T> {
  2. List _list = new List<T>();
  3. Array();
  4. void add<T>(T value) {
  5. this._list.add(value);
  6. }
  7. get value{
  8. return this._list;
  9. }
  10. }
  11. Array arr = new Array<String>();
  12. arr.add('aa');
  13. arr.add('bb');
  14. // arr.add(123); // type 'int' is not a subtype of type 'String' of 'value'
  15. print(arr.value); // [aa, bb]
  16. Array arr2 = new Array<int>();
  17. arr2.add(1);
  18. arr2.add(2);
  19. print(arr2.value); // [1,2]

泛型接口

下面声明了一个 Storage 接口,然后 Cache 实现了接口,能够约束存储的 value 的类型:

  1. abstract class Storage<T>{
  2. Map m = new Map();
  3. void set(String key, T value);
  4. void get(String key);
  5. }
  6. class Cache<T> implements Storage<T> {
  7. @override
  8. Map m = new Map();
  9. @override
  10. void get(String key) {
  11. print(m[key]);
  12. }
  13. @override
  14. void set(String key, T value) {
  15. print('set successed!');
  16. m[key] = value;
  17. }
  18. }
  19. print('----- 泛型接口 ------');
  20. Cache ch = new Cache<String>();
  21. ch.set('name', '123');
  22. // ch.set('name', 1232); // type 'int' is not a subtype of type 'String' of 'value'
  23. ch.get('name'); // String 123
  24. Cache ch2 = new Cache<Map>();
  25. // ch2.set('name', '23'); // type 'String' is not a subtype of type 'Map<dynamic, dynamic>' of 'value'
  26. ch2.set('ptbird', {'name': 'pt', 'age': 20});
  27. ch2.get('ptbird'); // {name: pt, age: 20}