Dart语法之泛型

本文首发于个人博客

泛型

  • 泛型是很多语言都支持的一种语法。例如Swift,Java,C++等。之前的文章C++语法之模板 详细介绍了C++中的泛型。

List泛型使用

  • List 的泛型使用
1
2
3
4
// 创建List的方式
var names = ['eagle','ityongzhen',"abc"];
print(names); //[eagle, ityongzhen, abc]
print(names.runtimeType); //List<String>

上面的代码中,我们没有指定具体类型,但是跟根据类型推断可知其类型为 List<String>
除了类型的自动推断,还可以限制类型。如下

  • 限制类型
1
2
3
// 限制类型
var names2 = <String>['eagle','ityongzhen',"abc"]; //List<String>
List<String> names3 = ['eagle','ityongzhen',"abc"]; //List<String>

Map泛型使用

1
2
3
4
5
6
7
//创建Map的方式
var person = {'name':'eagle','age':16};
print(person.runtimeType);//_InternalLinkedHashMap<String, Object>

//限制类型
Map<String,Object> person2 = {'name':'eagle','age':16};
var person3 = <String, Object>{'name':'eagle','age':16};

类定义的泛型

  • 如果我们需要定义一个类, 用于存储位置信息Location, 但是并不确定使用者希望使用的是int类型,还是double类型, 甚至是一个字符串, 这个时候如何定义呢?

  • 一种方案是使用Object类型, 但是在之后使用时, 非常不方便

  • 另一种方案就是使用泛型.

Location类的定义: Object方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
main(List<String> args) {

Location loc1 = Location(10, 20);
Location loc2 = Location(10.6, 18.8);
print(loc1.x.runtimeType); //int
print(loc2.x.runtimeType); //double

}

class Location{
Object x;
Object y;
Location(this.x,this.y);
}

Location类的定义: 泛型方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main(List<String> args) {

// 自动推断
Location loc1 = Location(10, 20);
print(loc1.x.runtimeType); //int

//指定泛型 double
Location loc2 = Location<double>(10.6, 18.8);
print(loc2.x.runtimeType); //double

//指定泛型 String
Location loc3 = Location<String>('abc', "ad");
print(loc3.x.runtimeType); //String

}

class Location<T>{
T x;
T y;
Location(this.x,this.y);
}

如果我们希望类型只能是num类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main(List<String> args) {

// 自动推断
Location loc1 = Location(10, 20);
print(loc1.x.runtimeType); //int

//指定泛型 double
Location loc2 = Location<double>(10.6, 18.8);
print(loc2.x.runtimeType); //double

//报错 因为类型必须继承自num
Location loc3 = Location<String>('abc', "ad"); //报错
print(loc3.x.runtimeType); //String

}

class Location<T extends num>{
T x;
T y;
Location(this.x,this.y);
}

泛型方法的定义

  • 之前,Dart仅仅在类中支持泛型。后来在方法和函数中使用泛型的类型参数。
1
2
3
4
5
6
7
8
9
main(List<String> args) {
var names = ['eagle', 'ityongzhen'];
var first = getFirst(names);
print('$first ${first.runtimeType}'); // eagle String
}

T getFirst<T>(List<T> ts) {
return ts[0];
}

参考 https://ke.qq.com/course/469774