Dart中范型的理解

2022-01-13  本文已影响0人  c3ab73a8deab

刚开始学习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> {
  ........
  ........
}

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

上一篇 下一篇

猜你喜欢

热点阅读