问什么使用泛型
- 类型安全
- 生成更好的代码
- 减少代码重复
编译时能够检测出错误:
var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
names.add(42); // Error
静态分析:
abstract class ObjectCache {
Object getByKey(String key);
void setByKey(String key, Object value);
}
// 不使用泛型, 可能需要对其它类型进行定义, 比如 int
abstract class StringCache {
String getByKey(String key);
void setByKey(String key, String value);
}
// 使用泛型, 减少接口定义
abstract class Cache<T> {
T getByKey(String key);
void setByKey(String key, T value);
}
使用集合字面量
var names = <String>['Seth', 'Kathy', 'Lars'];
var uniqueNames = <String>{'Seth', 'Kathy', 'Lars'};
var pages = <String, String>{
'index.html': 'Homepage',
'robots.txt': 'Hints for web robots',
'humans.txt': 'We are people, not machines'
};
使用带有构造器的参数化类型
var nameSet = Set<String>.from(names);
var views = Map<int, View>();
泛型集合和它们的类型
泛型集合在运行时携带类型信息:
var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List<String>); // true
限制参数化类型
class Foo<T extends SomeBaseClass> {
// Implementation goes here...
String toString() => "Instance of 'Foo<$T>'";
}
class Extender extends SomeBaseClass {...}
// 使用
var someBaseClassFoo = Foo<SomeBaseClass>();
var extenderFoo = Foo<Extender>();
// 不指定具体父类
var foo = Foo();
print(foo); // Instance of 'Foo<SomeBaseClass>'
使用泛型方法
T first<T>(List<T> ts) {
// Do some initial work or error checking, then...
T tmp = ts[0];
// Do some additional checking or processing...
return tmp;
}