Dart tour: 12、泛型
泛型(或参数化类型)通常使用一个字母来代表类型参数,比如 E、T、S、K 和 V 等等。
#
为什么使用泛型泛型常用于需要要求类型安全的情况,但是也会对代码运行有好处:
- 正确指定泛型类型会产生更好的通用代码, 且可以更容易地发现并定位问题。
- 可以使用泛型来减少代码重复。可以在多个不同类型实现之间共享同一个接口声明。
#
如何定义泛型#
使用集合字面量List
、Set
以及 Map
字面量也可以是参数化的。定义参数化的 List
只需在中括号前添加 <type>
; 定义参数化的 Map
只需要在大括号前添加 <keyType, valueType>
#
使用泛型构造函数在调用构造方法时也可以使用泛型,只需在类名后用尖括号(<...>
)将一个或多个类型包裹即可。
#
泛型集合以及其类型Dart
的泛型类型是固化的,这意味着即便在运行时也会保持类型信息:
与
Java
不同的是,Java
中的泛型是类型擦除的,这意味着泛型类型会在运行时被移除。在Java
中你可以判断对象是否为List
但不可以判断对象是否为List<String>
。
#
限制泛型的类型范围有时使用泛型的时候可能会想限制泛型的类型范围,这时候可以使用 extends
关键字。
#
使用泛型方法起初 Dart
只支持在类的声明时指定泛型,现在同样也可以在方法上使用泛型,称之为泛型方法。
方法 first<T>
的泛型 T
可以在如下地方使用:
- 函数的返回值类型 (
T
) - 参数的类型 (
List<T>
) - 局部变量的类型 (
T tmp
)