Dart学习笔记07-泛型

2020-08-17  本文已影响0人  zombie

在 API 文档中你会发现基础数组类型 List 的实际类型是 List<E> 。 <…> 符号将 List 标记为 泛型 类型。 这种类型具有形式化的参数。 通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。
使用泛型的好处:可以提高代码质量 可以减少重复的代码

1.List和Map的泛型

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>
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
上一篇 下一篇

猜你喜欢

热点阅读