为什么要使用泛型?
泛型通常是类型安全所必需的,但它们的好处不仅仅是让代码运行:
- 正确指定泛型类型可以生成更好的代码。
- 可以使用泛型来减少代码重复。
如果希望列表仅包含字符串,则可以将其声明为List<String>
(读作“字符串列表”)。这样我们的程序员同事和开发工具就可以检测到将非字符串分配给列表可能是一个错误。以下是一个例子:
var names = <String>[];
names.addAll(['Seth', 'Kathy', 'Lars']);
names.add(42); // Error
使用泛型的另一个原因是减少代码重复。泛型可以在多种类型之间共享一个接口和实现,同时仍然利用静态分析。例如,假设创建一个用于缓存对象的接口:
abstract class ObjectCache {
Object getByKey(String key);
void setByKey(String key, Object value);
}
发现需要该接口的字符串特定版本,因此又创建了另一个接口:
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);
}
在此代码中,T 是替代类型。它是一个占位符,您可以将其视为开发人员稍后将定义的类型。