List<T> 通用泛型
List<String>
表示在这个定义的List中只能存放字符串类型,如果添加数字类型,代码运行时就会报错。
class Animal {}
class Cat extends Animal {}
class Bird extends Animal {}
class NewAnimal<T extends Animal> {
String toString() => "创建一个新的小动物: 'Foo<$T>'";
}
为何使用泛型
- 可以是代码的逻辑控制更严谨,有效的对程序进行类型检查
- 有效减少重复代码
- 并且在多种类型之间定义同一个接口实现
①不使用泛型
// 不用泛型 存储Object
abstract class ObjectData {
Object getByKey(String key);
void setByKey(String key,Object value);
}
// 不用泛型 存储String
abstract class StringData {
String getByKey(String key);
void setByKey(String key,String value);
}
②使用泛型
// 使用泛型
abstract class Data<T> {
T getByKey(String key);
void setByKey(String key,T value);
}
使用
var cat = NewAnimal<Cat>();
var bird = NewAnimal<Bird>();
// 不传泛型默认为Animal
var animal = NewAnimal();
print('cat${cat}');
print('bird${bird}');
print('animal${animal}');
List<NewAnimal> animals = List<NewAnimal>();
animals.add(cat);
animals.add(bird);
animals.add(animal);
print('animals:${animals}');
// 输出结果
I/flutter (13815): cat创建一个新的小动物: 'Foo<Cat>'
I/flutter (13815): bird创建一个新的小动物: 'Foo<Bird>'
I/flutter (13815): animal创建一个新的小动物: 'Foo<Animal>'
I/flutter (13815): animals:[创建一个新的小动物: 'Foo<Cat>', 创建一个新的小动物: 'Foo<Bird>', 创建一个新的小动物: 'Foo<Animal>']