Dart基础第十三篇:Dart之泛型、泛型方法、泛型类的创建及使用

/**
 * Dart之泛型:
 *  泛型就是解决类 接口 方法的复用性 以及对不特定数据类型的支持
 */

/**
 * 创建一个泛型方法
 * 下面这个方法没有指定返回参数 但是可以指定返回值的类型而且指定的返回类型必须要和返回值相对应
 */
T returnGenerics<T>(T value){
  return value;
}

/**
 * 泛型方法的使用 List就是内置的一个自带泛型的类 可以约定List泛型的属性
 */
List<String> getListData(){
  /**
   * 切记 方法是带泛型的 创建一个实例的时候 也要指定泛型。 否则会报错 type 'List<dynamic>' is not a subtype of type 'List<String>'
   * 当然 如果方法没有指定泛型 你实例的时候可以随便指定泛型;
   * 说白了 指定泛型就是为了约束相同类型。
   */
  List<String> list = new List();
  list.add("1");
  list.add("2");
  list.add("3");//✅
  //那这样就不能传入其他类型
  //list.add(1); ❌
  //list.add(true);❌
  return list;
}


/**
 * 泛型接口的使用 和泛型方法差不多 接口上的泛型和接口泛型必须一致
 */
abstract class InterfaceGenerics<T>{
  setData(String key,T value);
}

//如果指定了String类型 那么value必须为String类型
class TestInterfaceGenerics implements InterfaceGenerics<String>{
  @override
  setData(String key, value) {
    key = '1';
    value = '1';
    //这样定义会报错
    //value = 1;
  }

}

/**
 * 泛型类的自定义
 * 在类上定义泛型 在实例化类的时候进行属性约定
 *
 */
class ListDataClass<T>{
  List list = new List();
  add(T value){
    list.add(value);
  }
  detail(){
    return list.forEach((value)=> print(value));
  }
}

void main(){

  print('设置返回值为String类型并返回一个String字符串 '+returnGenerics<String>('1'));
  print('设置返回值为int类型并返回一个数字 ${returnGenerics<int>(123)}');
  getListData().forEach((value)=>print(value));

  ListDataClass listDataClass = new ListDataClass<String>();
  listDataClass.add("3");
  listDataClass.add("2");
  listDataClass.add("1");
  //这种赋值在编译的时候就会报错
  //listDataClass.add(1);
  listDataClass.detail();

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值