1.简介:
  Dart语言是强类型语言,强类型语言都支持泛型Generics。那么什么是泛型呢?
泛型是指代码在使用时才指定类型,即在实例化时作为参数指明这些类型
的设计模式。泛型的参数代表类的类型,而不是函数参数是类的某个实例。
2.Dart中的泛型及使用:
在 API 文档中你会发现基础数组类型
List的实际类型是List<E>。 <…> 符号将 List 标记为 泛型 (或 参数化) 类型。 这种类型具有形式化的参数。 通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。
泛型的定义:
- 使用
<...>定义传入的泛型; - 
...通常使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等,只是传入类的一个占位符; 
abstract class List<E> implements EfficientLengthIterable<E> 
3.泛型的优点:
- 正确地指定泛型类型可以生成更好的代码;
 - 泛型来减少很多重复的代码;
 - 泛型可以在多种类型之间定义同一个实现;
 - 泛型使用时可以静态检查和推断类型,如果不符合泛型类型,会报编译错误。
 
// 静态检查和推断类型,类型不符,报错
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是替代类型。它是一个占位符,您可以将其视为开发人员稍后将定义的类型。
  T getByKey(String key);
  void setByKey(String key, T value);
}
4.泛型在集合中的使用:
4.1定义集合泛型变量:
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'
};
4.2集合泛型的构造函数:
var nameSet = Set<String>.from(names);
var views = Map<int, View>();
var names = <String>[];
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List<String>); // true
4.3限制泛型参数类型:
  使用<T extends ClassName>限制泛型传入的类的类型,表示传入的类必须是ClassName的类及其子类,传入其它类会报错。
  泛型<T>与<T extends Object?>等价。
// 限制传入泛型类的类型为SomeBaseClass类及其子类
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>'
var foo = Foo<Object>();  // 报错,Object不是SomeBaseClass的类及其子类
5.泛型方法generic methods的使用:
最初,Dart的泛型只支持类的泛型。后续,又支持了方法的泛型,叫做泛型方法。
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的类型。 










网友评论