Dart 笔记 11 - 泛型

泛型类

abstract class Cache<T> {
  T getByKey(String key);
  void setByKey(String key, T value);
}

List 和 Map 字面量可以被参数化。参数化字面量就是在字面量的开始括号之前添加 <type>(对于 List)或者添加 <keyType, valueType>(对于 Map)。

var names = <String>['Seth', 'Kathy', 'Lars'];
var pages = <String, String>{
  'index.html': 'Homepage',
  'robots.txt': 'Hints for web robots',
  'humans.txt': 'We are people, not machines'
};

要在使用构造函数时指定一个或多个类型,将类型放在类名后面的尖括号中。和 Java 一样。

var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
var nameSet = Set<String>.from(names);

Dart 通用类型被具体化,意味着它们在运行时携带它们的类型信息。

var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List<String>); // true

限制类型

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(); // 不指定泛型就是 SomeBaseClass
print(foo); // Instance of 'Foo<SomeBaseClass>'

var foo = Foo<Object>(); // 报错

泛型方法

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)

猜你喜欢

转载自blog.csdn.net/weixin_33928137/article/details/87217032