Dart之泛型

Dart泛型简记

Posted by XYH on June 28, 2019

本文记录Dart泛型。

为何使用泛型

Dart 中类型是可选的,有些情况下可能想使用类型来表明你的意图,不管是使用泛型还是具体类型。

这点跟其他强类型语言非常类似,Dart泛型跟Java的泛型基本一致。

1
2
  var list = new List<String>();
  list.addAll(["a","b","c"]);

另外一个使用泛型的原因是减少重复的代码。 泛型可以在多种类型之间定义同一个实现, 同时还可以继续使用检查模式和静态分析工具提供的代码分析功能。 例如,创建一个保存缓存对象的接口:

1
2
3
4
abstract class ObjectCache{
  Object getCache();
  setByKey(String key,Object value);
}

如果再需要一个缓存String的Cache。

1
2
3
4
abstract class StringCache{
  String getCache();
  setByKey(String key, String value);
}

为了避免重复,泛型就能利用上了。

1
2
3
4
abstract class Cache<T> {
  T getCache();
  setByKey(String key, T value);
}

使用集合字面量

List 和 map 字面量也是可以参数化的。 参数化定义 list 需要在中括号之前 添加 <type> , 定义 map 需要在大括号之前 添加 <keyType, valueType>。 如果需要更加安全的类型检查,则可以使用 参数化定义。下面是一些示例:

1
2
  var names = <String>["A", "B", "C"];
  var maps = <String, String>{"A": "a", "B": "b"};

在构造函数中使用泛型

1
2
3
4
  var list = new List<String>();
  list.addAll(["a","b","c"]);
  
  var set = new Set<String>.from(list);

限制泛型类型

当使用泛型类型的时候,可能想限制泛型的具体类型。 使用 extends 可以实现这个功能:

1
2
3
4
5
6
7
class Person {
  
}

class Worker<T extends Person> {
  
}

使用泛型函数

1
2
3
4
5
6
7
T first<T>(List<T> ts) {
  return ts[0];
}

Map<K, V> singleMap<K, V>(K k, V v) {
  return <K, V>{k : v};
}