Dart - 类(静态、泛型)
2020-01-01 本文已影响0人
LouisXWB
静态
使用关键字 static 可以声明类变量或类方法。
静态变量
静态变量(即类变量)常用于声明类范围内所属的状态变量和常量:
class Queue {
static const initialCapacity = 16;
// ···
}
void main() {
assert(Queue.initialCapacity == 16);
}
备忘📝:静态变量在其首次被使用的时候才被初始化。
静态方法
静态方法(即类方法)不能被一个类的实例访问,同样地,静态方法内也不可以使用this
:
class Point {
num x, y;
Point(this.x, this.y);
static num distanceBetween(Point a, Point b) {
var dx = a.x - b.x;
var dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
}
void main() {
var a = Point(2, 2);
var b = Point(4, 4);
var distance = Point.distanceBetween(a, b);
assert(2.8 < distance && distance < 2.9);
print(distance);
}
可以将静态方法作为编译时常量。例如,你可以将静态方法作为一个参数传递给一个常量构造函数。
泛型
为什么使用泛型?
泛型常用于需要要求类型安全
的情况,但是它也会对代码运行有好处:
- 适当地指定泛型可以更好地帮助代码生成。
- 使用泛型可以减少代码重复。
- 提高代码的可维护性和协同开发。
使用集合字面量
List、Set 以及 Map 字面量也可以是参数化的。定义参数化的 List 只需在中括号前添加 <type>;定义参数化的 Map 只需要在大括号前添加 <keyType, valueType>:
var names = <String>['小芸', '小芳', '小民'];
var uniqueNames = <String>{'小芸', '小芳', '小民'};
var pages = <String, String>{
'index.html': '主页',
'robots.txt': '网页机器人提示',
'humans.txt': '我们是人类,不是机器'
};
使用类型参数化的构造函数
在调用构造方法时也可以使用泛型,只需在类名后用尖括号(<...>)将一个或多个类型包裹即可:
var nameSet = Set<String>.from(names);
下面代码创建了一个键为 Int 类型,值为 View 类型的 Map 对象:
var views = Map<int, View>();
备忘📝: 与 Java 不同的是,Java 中的泛型是类型 擦除
的,这意味着泛型类型会在运行时被移除。在 Java 中你可以判断对象是否为 List 但不可以判断对象是否为 List<String>。
使用泛型方法
起初 Dart 只支持在类的声明时指定泛型,现在同样也可以在方法上使用泛型,称之为 泛型方法
:
T first<T>(List<T> ts) {
// 处理一些初始化工作或错误检测……
T tmp = ts[0];
// 处理一些额外的检查……
return tmp;
}
方法 first<T> 的泛型 T 可以在如下地方使用:
-
函数的返回值类型 (T)。
-
参数的类型 (List<T>)。
-
局部变量的类型 (T tmp)。
你可以查阅使用泛型函数获取更多关于泛型的信息。