1 List和Map的泛型

  1. // 创建List的方式
  2. var names1 = ['why', 'kobe', 'james', 111];
  3. print(names1.runtimeType); // List<Object>
  4. // 限制类型
  5. var names2 = <String>['why', 'kobe', 'james', 111]; // 最后一个报错
  6. List<String> names3 = ['why', 'kobe', 'james', 111]; // 最后一个报错
  1. // 创建Map的方式
  2. var infos1 = {1: 'one', 'name': 'why', 'age': 18};
  3. print(infos1.runtimeType); // _InternalLinkedHashMap<Object, Object>
  4. // 对类型进行显示
  5. Map<String, String> infos2 = {'name': 'why', 'age': 18}; // 18不能放在value中
  6. var infos3 = <String, String>{'name': 'why', 'age': 18}; // 18不能放在value中

2 类定义的泛型

  1. main(List<String> args) {
  2. Location l1 = Location(10, 20);
  3. print(l1.x.runtimeType); // Object
  4. }
  5. class Location {
  6. Object x;
  7. Object y;
  8. Location(this.x, this.y);
  9. }

如果我们希望类型只能是num类型, 怎么做呢?

  1. main(List<String> args) {
  2. Location l2 = Location<int>(10, 20);
  3. print(l2.x.runtimeType);
  4. // 错误的写法, 类型必须继承自num
  5. Location l3 = Location<String>('aaa', 'bbb');
  6. print(l3.x.runtimeType);
  7. }
  8. class Location<T extends num> {
  9. T x;
  10. T y;
  11. Location(this.x, this.y);
  12. }

3 泛型方法的定义

最初,Dart仅仅在类中支持泛型。后来一种称为泛型方法的新语法允许在方法和函数中使用类型参数。

  1. main(List<String> args) {
  2. var names = ['why', 'kobe'];
  3. var first = getFirst(names);
  4. print('$first ${first.runtimeType}'); // why String
  5. }
  6. T getFirst<T>(List<T> ts) {
  7. return ts[0];
  8. }