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
的类型。
网友评论