在 API 文档中你会发现基础数组类型 List 的实际类型是 List<E>
。 <…> 符号将 List 标记为 泛型 类型。 这种类型具有形式化的参数。 通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。
使用泛型的好处:可以提高代码质量 可以减少重复的代码
1.List和Map的泛型
- List使用时的泛型写法:
var name1 = ['wang', 'liu', 'zhao', 111];
print(name1.runtimeType); // List<Object>
// 限制类型
var name2 = <String>['wang', 'liu', 'zhao'];
List<String> name3 = ['wang', 'liu', 'zhao'];
print(name2.runtimeType); // List<String>
print(name3.runtimeType); // List<String>
- Map使用时的泛型写法
var info1 = {1: 'one', 'name': 'wang', 'age': 18};
print(info1.runtimeType); // _InternalLinkedHashMap<Object, Object>
var info2 = <String, String>{'name': 'wang'};
Map<String, String> info3 = {'name': 'wang'};
print(info2.runtimeType); // _InternalLinkedHashMap<String, String>
print(info3.runtimeType); // _InternalLinkedHashMap<String, String>
2.类定义的泛型
- 当定义一个类时不确定属性的类型时,这时可以使用泛型
代码示例:
class Location1<T> {
T x;
T y;
Location1(this.x, this.y);
}
Location1 l1 = Location1<int>(10, 20);
print(l1.x.runtimeType); // int
Location1 l2 = Location1<String>('aaa', 'bbb');
print(l2.x.runtimeType); // String
希望类型只能是num类型时:
class Location2<T extends num> {
T x;
T y;
Location2(this.x, this.y);
}
Location2 l4 = Location2<int>(10, 20);
print(l4.x.runtimeType); // int
// 错误的写法, 类型必须继承自num
// Location2 l4 = Location2<String>('aaa', 'bbb');
// print(l4.x.runtimeType);
3.泛型方法的定义
T getFirst<T>(List<T> ts) {
return ts[0];
}
var names = ['wang', 'liu'];
var first = getFirst(names);
print('$first ${first.runtimeType}'); // wang String
网友评论