泛型类
abstract class Cache<T> {
T getByKey(String key);
void setByKey(String key, T value);
}
List 和 Map 字面量可以被参数化。参数化字面量就是在字面量的开始括号之前添加 <type>
(对于 List)或者添加 <keyType, valueType>
(对于 Map)。
var names = <String>['Seth', 'Kathy', 'Lars'];
var pages = <String, String>{
'index.html': 'Homepage',
'robots.txt': 'Hints for web robots',
'humans.txt': 'We are people, not machines'
};
要在使用构造函数时指定一个或多个类型,将类型放在类名后面的尖括号中。和 Java 一样。
var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
var nameSet = Set<String>.from(names);
Dart 通用类型被具体化,意味着它们在运行时携带它们的类型信息。
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(); // 不指定泛型就是 SomeBaseClass
print(foo); // Instance of 'Foo<SomeBaseClass>'
var foo = Foo<Object>(); // 报错
泛型方法
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;
}
first 上的泛型参数 <T>
允许在很多地方使用类型参数 T:
- 在函数的返回中返回类型(
T
) - 在参数的类型中使用(
List<T>
) - 在局部变量的类型中(
T tmp
)
网友评论