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)); //张三

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Dart 是一种支持泛型的面向对象语言,它允许我们在定义类、函数或方法时使用参数化类型。泛型允许我们在不指定具体类型的情况下编写通用的代码,提高代码的重用性和安全性。 在 Dart 中,泛型的类型变化可分为两种:类型的协变(Covariance)和类型的逆变(Contravariance)。 类型的协变指的是可以将泛型类型的子类型赋值给父类型,这样就可以确保在使用泛型类型时不会发生类型不匹配的错误。例如,如果有一个泛型类 Animal<T>,其中 T 是一个类型参数,那么 Animal<Dog> 就是 Animal<Animal> 的子类型。这样我们可以使用 Animal<Animal> 类型的变量来持有 Animal<Dog> 的实例,而不会出现类型错误。 类型的逆变与协变相反,指的是可以将泛型类型的父类型赋值给子类型。这样可以更灵活地使用泛型类型,更好地符合实际的业务需求。例如,如果有一个泛型类 Comparator<T>,其中 T 是一个类型参数,那么 Comparator<Animal> 就是 Comparator<Dog> 的父类型。这样我们可以使用 Comparator<Dog> 类型的变量来持有 Comparator<Animal> 的实例,而不会出现类型错误。 泛型的型变在 Dart 中使用通配符来表示,泛型类型的协变使用 extends 关键字,逆变使用 super 关键字。例如,在声明一个泛型类型时,我们可以使用 Animal<? extends Animal> 表示协变,使用 Comparator<? super Dog> 表示逆变。这样的声明帮助我们在使用泛型类型时确保类型的正确性。 总结来说,Dart 中的泛型支持类型的协变和逆变,这样可以更灵活、更安全地使用泛型类型。泛型的型变通过使用通配符、extends 和 super 关键字来表示,使得泛型类型的赋值更加灵活,能够满足不同的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱良浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值