美文网首页
Dart中范型的理解

Dart中范型的理解

作者: c3ab73a8deab | 来源:发表于2022-01-13 15:26 被阅读0次

刚开始学习flutter时,以下代码都非常熟悉

class FirstPage extends StatefulWidget {
  @override
  createState() => new FirstPageState();
}

class FirstPageState extends State<FirstPage> {
  @override
  Widget build(BuildContext context) {
    return new Text('hello word');
  }
}

其中就很奇怪这个尖括号是干什么的,以为是固定写法。

oc语言中类接口中尖括号通常表示类符合的协议。例如

@interface TestViewController ()<UITableViewDelegate,UITableViewDataSource>

表示TestViewController要遵从后面的协议

NSArray<NSString *> *array;

表示数组里存放的是字符串类型。其实这一点和dart中的用法是一致的

var names = List<String>();
names.addAll(['zhangsan', 'lisi', '王五']);
names.add(123); // Error

最后一句增加整型就会报错,因为<String>表示names中只接受字符串类型

其实我们从它延展开来就是范型,范型是在不确定类型情况下使用的

比如我们同样定义一个数组list,它可以即支持整型、也可以支持字符串

var names = List<T>();

在上述数组中我们可能还不好理解,放到下面例子就容易理解多了

class SomeThingStr {
  String getWithKey(String key);
  void setWithKey(String key, String value);
}

这是一个存放String的类,但是如果我想存放其他类型需要改成下面样子

class SomeThingList {
  List getWithKey(String key);
  void setWithKey(String key, List value);
}

想改成任意类型我可以用范型来实现

class SomeThingObject<T> {
  T getWithKey(String key);
  void setWithKey(String key, T value);
}

这样做可以实现对多种数据类型的适配,并且同时可以进行静态代码检查。

其实最开始并没有太理解类后面<>是什么意思,以为和List<String>是一样的,其实class SomeThingObject<T> 只是一种声明,声明里面所有的T都代表一种同样的类型。

那么回到最开始的问题

class FirstPageState extends State<FirstPage> {
}

这里的<FirstPage>是什么意思,其实我们看一下源码State的实现就明白了

abstract class State<T extends StatefulWidget> with Diagnosticable {

  T get widget => _widget!;
  T? _widget;

  
  _StateLifecycle _debugLifecycleState = _StateLifecycle.created;
    ........
  ........
}

我们截取部分代码,State中声明了范型T,T需要是StatefulWidget的子类,我们在声明FirstPageState时设置了这个范型T为FirstPage类。那么FirstPageState中子类里的范型T都是FirstPage类型。

同样看下list的

abstract class List<E> implements EfficientLengthIterable<E> {
  ........
  ........
}

其实都是一样的,尖括号就是表示的范型

相关文章

  • Dart中范型的理解

    刚开始学习flutter时,以下代码都非常熟悉 其中就很奇怪这个尖括号是干什么的,以为是固定写法。 oc语言中类接...

  • Dart之旅08: 范型

    如果你查阅List类的API文档,你会看见类型的写法是List这里的E就是范型,它指代这个类型的实例是某种类...

  • CoreJava笔记 - 范型程序设计(5)

    反射与范型 由于类型擦除,反射无法得到关于范型类型参数的信息。 范型的Class类在Java的反射库中,Class...

  • Dart-数据类型:数值型

    Dart中的数据类型主要有: 数值型-Number 分为整型int和浮点型double 字符型-String 布尔...

  • TypeScript中的范型

    一、定义 比如我们有一个函数,如果不使用范型是这样的 它只能传入number类型,如果我们要传入一个string类...

  • python 函数 map 、lambda

    开篇就要提到一个大的话题:编程范型。什么是编程范型?引用维基百科中的解释: 编程范型或编程范式(英语:Progra...

  • Java中的泛型/范型

    维基百科中关于Java泛型的描述 Java 泛型的参数只可以代表类,不能代表个别对象。由于Java泛型的类型参数之...

  • dart系列之:dart类中的泛型

    简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念。什么是泛型呢?泛型就是一种通用的类型格式,一般用...

  • 2. Dart - 基本数据类型

    本文主要介绍Dart 中的几种基本数据类型:数值型-Number、布尔型-boolean、字符串-String、列...

  • Rust范型(2) - 范型约束

    trait中的范型 在定义trait时,可以使用范型: Dagongren是一个trait,包含了banzhuan...

网友评论

      本文标题:Dart中范型的理解

      本文链接:https://www.haomeiwen.com/subject/evbncrtx.html