问什么使用泛型
- 类型安全
- 生成更好的代码
- 减少代码重复
编译时能够检测出错误:
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);}// 不使用泛型, 可能需要对其它类型进行定义, 比如 intabstract 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;}
