为什么使用范性

让代码变得优雅

范性与构造函数

  1. Set<String>.from(names);
  2. var views = Map<int, View>();

范性集合

  1. var list = <String>{"a", "b"};
  2. var set = <String>["a", "b"];
  3. var map = <String, String> {
  4. "x1": "y1",
  5. "x2": "y2",
  6. };

范性方法

方法的范性声明在方法名称后<T>声明

  1. main() {
  2. GenericsTest g = GenericsTest();
  3. print(g.getData(23));
  4. print(g.getData("Test"));
  5. print(g.getData(true));
  6. }
  7. class GenericsTest {
  8. T getData<T>(T val) {
  9. return val;
  10. }
  11. }

当然,和Java一样,也可以同时声明多个范性名称

范性类

和方法不一样的是,声明在类名上,从本质上想,方法也是一个Function对象,所以声明形式上无本质区别

  1. abstract class GenericsTest<T extends Object> {
  2. T getKey(String key);
  3. void setByKey(String key, T value);
  4. }

同时 <T extends Object> 可以限制参数的类型,为指定类型或其子类

  1. abstract class GenericsTest<T extends Object> {
  2. T getKey(String key);
  3. void setByKey(String key, T value);
  4. }
  5. class GenericsTestImpl<T extends Object> implements GenericsTest<T> {
  6. @override
  7. T getKey(String key) {
  8. // TODO: implement getKey
  9. throw UnimplementedError();
  10. }
  11. @override
  12. void setByKey(String key, T value) {
  13. // TODO: implement setByKey
  14. }