一 泛型的定义
通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验)
// 定义一个函数 传入什么类型的参数 返回什么类型的参数
T getData<T>(T value) {
return value;
}
print(getData(8888));
// 指定泛型的类型
getData<int>(3);
二 泛型类
// 定义一个泛型类
class MyList<T> {
List list = <T>[];
void add(T value) {
list.add(value);
}
getList() {
return list;
}
}
void main() {
runApp(const MyApp());
MyList list = MyList();
// 给自己定义的list 添加不同类型的数据
list.add(222);
list.add("okay boy");
list.add(true);
print(list.getList());
//定义只能传入指定类型的数据
MyList list2 = MyList<String>();
list2.add("dog");
print(list2.getList());
}
三 泛型接口
Dart中的泛型接口:
实现数据缓存的功能:有文件缓存、和内存缓存。内存缓存和文件缓存按照接口约束实现。
1、定义一个泛型接口 约束实现它的子类必须有getByKey(key) 和 setByKey(key,value)
2、要求setByKey的时候的value的类型和实例化子类的时候指定的类型一致
abstract class Cache<T> {
// 读数据
getDataByKey(String key);
// 写数据
setData(String key, T value);
}
class FileCache<T> implements Cache {
@override
getDataByKey(String key) {
// TODO: implement getDataByKey
return null;
}
@override
setData(String key, value) {
// TODO: implement setData
print("FileCache Set Data");
}
}
class MemoryCache<T> implements Cache {
@override
getDataByKey(String key) {
// TODO: implement getDataByKey
return null;
}
@override
setData(String key, value) {
// TODO: implement setData
print("MemoryCache Set Data --$key --$value");
}
}
void main() {
MemoryCache mc = new MemoryCache<Map>();
// 打印结果 MemoryCache Set Data --Leonardo --{name: apple}
mc.setData("Leonardo", {"name": "apple"});
runApp(const MyApp());
}