枚举
枚举的定义
枚举使用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];
}