1 List和Map的泛型
// 创建List的方式var names1 = ['why', 'kobe', 'james', 111];print(names1.runtimeType); // List<Object>// 限制类型var names2 = <String>['why', 'kobe', 'james', 111]; // 最后一个报错List<String> names3 = ['why', 'kobe', 'james', 111]; // 最后一个报错
// 创建Map的方式var infos1 = {1: 'one', 'name': 'why', 'age': 18};print(infos1.runtimeType); // _InternalLinkedHashMap<Object, Object>// 对类型进行显示Map<String, String> infos2 = {'name': 'why', 'age': 18}; // 18不能放在value中var infos3 = <String, String>{'name': 'why', 'age': 18}; // 18不能放在value中
2 类定义的泛型
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);}
如果我们希望类型只能是num类型, 怎么做呢?
main(List<String> args) {Location l2 = Location<int>(10, 20);print(l2.x.runtimeType);// 错误的写法, 类型必须继承自numLocation l3 = Location<String>('aaa', 'bbb');print(l3.x.runtimeType);}class Location<T extends num> {T x;T y;Location(this.x, this.y);}
3 泛型方法的定义
最初,Dart仅仅在类中支持泛型。后来一种称为泛型方法的新语法允许在方法和函数中使用类型参数。
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];}
