如果你看过API文档的基本类型数组和列表,你会发现实际上所有都是泛型,使用泛型可以提高代码的可读性
var names = new List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
//检查模式编译失败,生产模式编译成功
names.add(42);
使用泛型的另一个原因是减少代码重复,泛型可以创建多类型共享的接口,同时还能在检查模式早期预警,假如您创建一个接口缓存对象
abstract class ObjectCache {
Object getByKey(String key);
setByKey(String key, Object value);
}
如果你想要的只是String的接口,你可以创建另一个接口
abstract class StringCache {
String getByKey(String key);
setByKey(String key, String value);
}
再如果,你想要一个number的接口,是不是很麻烦,使用泛型类型可以节省您创建这些接口的麻烦
abstract class Cache<T> {
T getByKey(String key);
setByKey(String key, T value);
}
在上面代码中,T是类型的替身,可以认为是开发人员自定义的类型的占位符
字符串类型的list和map可以参数化
var names = ['Seth', 'Kathy', 'Lars'];
var pages = {
'index.html': 'Homepage',
'robots.txt': 'Hints for web robots',
'humans.txt': 'We are people, not machines'
};
指定一个或多个类型使用一个构造函数
var names = new List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
var nameSet = new Set<String>.from(names);
下面的代码创建了map、integer和Key Value
var views = new Map<int, View>();
dart的泛型类型需要具体化,这意味着泛型在运行时携带着类型信息
var names = new List();
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List);
import、part和library指令可以帮助您创建模块和共享代码,库不仅提供api,还是privacy权限的单位:标识符为下划线( _ )是只有在包内可见的,每个dart应用程序都是一个库,即使它不使用库的指令
使用 import 指定一个命名空间从一个库中使用另一个库
import 'dart:html';
dart: 开头的是dart内置的库,其他的库用 package: 开头
import 'dart:io';
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';
如果你导入的两个库有冲突的标识符,你可以为其中一个或两个库都指定一个前缀
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// ...
var element1 = new Element();
var element2 = new lib2.Element();
如果你只想要使用一个库的一部分,可以选择性的导入
//只导入foo
import 'package:lib1/lib1.dart' show foo;
//导入除了foo以外的所有
import 'package:lib2/lib2.dart' hide foo;
在必要的时候允许程序延迟加载一个库的需求,延迟加载库,您必须使用 deferred as
import 'package:deferred/hello.dart' deferred as hello;
当你需要使用库,使用 loadLibrary() 调用库
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
上面代码中,await 关键字暂停执行直到加载库,您可以多次使用loadLibrary(),库只加载一次
使用 library identifier 指定库的标识符
library ballgame;
import 'dart:html';
//...
第一个 ballgame.dart 声明了ballgame库和需要的ball.dart和util.dart
library ballgame;
import 'dart:html';
//...
part 'ball.dart';
part 'util.dart';
//...
第二个 ball.dart 实现ballgame的一部分
part of ballgame;
//...
第三个 util.dart 实现ballgame的其他部分
part of ballgame;
//...
您可以通过再结合或重新包装库的部分或全部
library french;
hello() => print('Bonjour!');
goodbye() => print('Au Revoir!');
library togo;
import 'french.dart';
export 'french.dart' show hello;
import 'togo.dart';
void main() {
hello();
goodbye();
}