07.Dart - 泛型

个人学习用
不严谨
学习的话请看别的博客

为什么使用泛型

void main(){
  /**
   * 为什么使用泛型?
   * 将编译时期和运行时期的错误,提到了编码时期,提前发现错误,节省修改时间.
   * 泛型可以减少代码重复。
   */
}

使用集合字面量

void main() {
  /**
   * 使用集合字面量
   * List、Set 以及 Map 字面量也可以是参数化的。
   * 定义参数化的 List 只需在中括号前添加 <type>;
   * 定义参数化的 Map 只需要在大括号前添加 <keyType, valueType>:
   */
  var names = <String>['张三', '李四', '王五'];
  var ages = <String>{'11', '22', '33'};
  var pages = <String, int>{'html': 1, 'web': 2, 'haha': 3};
}

使用类型参数化构造函数

void main() {
  /**
   * 使用类型参数化构造函数
   * 在调用构造方法时候也可使用泛型,只需要在类后面加上<泛型种类>,来包裹,再调用构造方法
   */

  var names = <String>['张三', '李四', '王五'];
  var ages = <int>[1,2,3,4,5];

  var p1 = List<int>.from(ages);  // [1, 2, 3, 4, 5]
  print(p1);

  //会报错,names不是int类型的数组
  var p = List<int>.from(names);  //type 'String' is not a subtype of type 'int'
  print(p);
}

/*
class Point {
  var i;

  Point(this.i);

  void show() {
    print(i);
  }
}
*/

泛型集合以及他们所包含的类型

void main() {
  /**
   * 泛型集合以及他们所包含的类型
   * Dart的 泛型类型是 固定的,在运行时也会保持类型
   */
  var names = new List<String>();
  names.addAll(['张三', '李四', '王五']);
  print(names is List<String>); //true

  //与 Java 不同的是,Java 中的泛型是类型 擦除 的,这意味着泛型类型会在运行时被移除。
  //在 Java 中可以判断对象是否为 List
  //但不可以判断对象是否为 List<String>。
}

限制参数化类型 extends

void main() {
  /**
   * 限制参数化类型
   * extends 关键字
   * T extends Num
   */
  var t = Test<Son>();
  var t1 = Test<Father>();
  t.show();  //false false
  t1.show(); //false false
}

class Father {}

class Son extends Father {}

//限制传入的泛型T 为 Father类的子类或者是Father类
class Test<T extends Father> {
  T t;

  void show() {
    print(t is Father);
    print(t is Son);
  }
}

使用泛型方法

void main() {
  /**
   * 泛型方法
   * 使用部位:
   * 返回值 T
   * 参数类型 List<T>
   * 局部变量 T t;
   */
  T getFirstListIndex<T>(List<T> list) {
    T t = list[0];
    return t;
  }

  List<String> list = ['张三', '李四', '王五'];

  print(getFirstListIndex(list)); //张三

}
发布了33 篇原创文章 · 获赞 6 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/zlhyy666666/article/details/104581219