枚举
枚举的定义
枚举使用enum关键字来进行定义:
main(List<String> args) {
  print(Colors.black);
}
enum Colors {
  white,
  red,
  black,
}
枚举的属性
枚举类型中有两个比较常见的属性:
- index: 用于表示每个枚举常量的索引, 从0开始.
- values: 包含每个枚举值的List.
main(List<String> args) {
  print(Colors.black);
  //Colors.black
  print(Colors.black.index);
  //2
  print(Colors.values);
  //[Colors.white, Colors.red, Colors.black]
}
enum Colors {
  white,
  red,
  black,
}
枚举类型的注意事项:
- 注意一: 您不能子类化、混合或实现枚举。
- 注意二: 不能显式实例化一个枚举
泛型
List和Map的泛型
List使用时泛型的写法:
  var names1 = ["dabai", "xiaobai", "xiaohei", 1];
  print(names1.runtimeType);
  //List<Object>
  //限制类型
  var names2 = <String>["xiaobai", "dabai", 1]; //最后一个报错
  List<String> names3 = ["xiaobai", "dabai", 1];//最后一个报错
Map使用时泛型的写法:
  var map1 = {"name": "dabai", "age": 1, "gendar": "Male"};
  //限制类型
  var map2 = <String, String>{"name": "xiaobai", "age": 1, "gendar": "Male"};//第二个报错
  Map<String, String> map3 = {"name": "xiaobai", "age": 1, "gendar": "Male"};//第二个报错
类定义的泛型
如果我们需要定义一个类, 用于存储位置信息Location, 但是并不确定使用者希望使用的是int类型,还是double类型, 甚至是一个字符串, 这个时候如何定义呢?
- 一种方案是使用Object类型, 但是在之后使用时, 非常不方便
- 另一种方案就是使用泛型.
Location类的定义:Object方式
main(List<String> args) {
  Location l1 = Location(10, 20);
  print(l1.x.runtimeType); // Object
}
class Location {
  Object x;
  Object y;
  Location(this.x, this.y);
}
Location类的定义:泛型方式
main(List<String> args) {
  Location l2 = Location<int>(10, 20);
  print(l2.x.runtimeType); // int 
  Location l3 = Location<String>('aaa', 'bbb');
  print(l3.x.runtimeType); // String
}
}
class Location<T> {
  T x;
  T y;
  Location(this.x, this.y);
}
如果希望类型只能是num类型呢?
main(List<String> args) {
  Location l2 = Location<int>(10, 20);
  print(l2.x.runtimeType);
    
  // 错误的写法, 类型必须继承自num
  Location l3 = Location<String>('aaa', 'bbb');
  print(l3.x.runtimeType);
}
class Location<T extends num> {
  T x;
  T y;
  Location(this.x, this.y);
}
泛型方法的定义
main(List<String> args) {
  var names = ['why', 'kobe'];
  var first = getFirst(names);
  print('$first ${first.runtimeType}'); // why String
}
T getFirst<T>(List<T> ts) {
  return ts[0];
}