Dart学习12、Dart中的泛型 泛型方法 泛型类 泛型接口

本文介绍了Dart语言中泛型方法和泛型类的使用,通过示例展示了如何创建和使用泛型类来存储不同类型的元素。此外,还探讨了泛型接口的概念,以`Cache`接口为例,解释了如何定义并实现带有类型约束的泛型接口,确保数据操作的一致性。示例中包括了`MemoryCache`和`FileCache`两个实现类,强调了指定类型的重要性。
摘要由CSDN通过智能技术生成

泛型方法

T getData<T>(T value){
  return value;
}
void main(List<String> args) {
  //没有类型校验
  print(getData(23));
  print("AAA");
  //指定类型
  print(getData<int>(34));
  print(getData<String>("BBB"));
}

泛型类

class MyList<T> {
  List list = <T>[];
  void add(T value) {
    this.list.add(value);
  }

  List getList() {
    return list;
  }
}

void main(List<String> args) {
  // 可传入任意类型数据
  MyList l = MyList();
  l.add(1);
  l.add("AA");
  l.add(true);
  print(l.getList()); //[1, AA, true]
  //实例化的时候可指定传入类型数据  
  MyList l1 = new MyList<String>();//只能传入String的数据
  l1.add("11");
  l1.add("AA");
  l1.add("33");
  print(l1.getList()); //[11, AA, 33]
}

Dart中的泛型接口

示例:  
实现数据缓存的功能:有文件缓存、内存缓存。内存缓存和文件缓存按照接口约束实现
1、定义一个泛型接口 约束实现它的子类必须有getByKey(key)和setByKey(key,value)
2、要求setByKey的时候的value的类型和实例化子类的时候指定的类型一致
abstract class Cache<T> {
  getByKey(String key);

  void setByKey(String key, T value);
}

class FileCache<T> implements Cache<T>{
  @override
  getByKey(String key) {
    return key;
  }

  @override
  void setByKey(String key, T value) {
     print("我是文件缓存,把key=${key} value=${value}的数据写入到了内存中");
  }
}

class MemoryCache<T> implements Cache<T>{
  @override
  getByKey(String key) {
  return key;
  } 

  @override
  void setByKey(String key, T value) {
    print("我是内存缓存,把key=${key} value=${value}的数据写入到了内存中");
  }
}

void main(List<String> args) {
  //指定传入类型为String
  MemoryCache m = new MemoryCache<String>();
  m.setByKey("内存", "数据A");
 //指定传入类型为Map
  MemoryCache m1 = new MemoryCache<Map>();
  m1.setByKey("内存", {"name":"AA","age":23});

}

Dart学习记录,一起学习哦~

  • 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
发出的红包

打赏作者

JMchen123

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

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

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

打赏作者

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

抵扣说明:

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

余额充值