通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验)
泛型方法
不指定类型放弃了类型检查。我们现在想实现的是传入什么 返回什么。比如:传入number 类型必须返回number类型 , 传入string类型必须返回string类型
//- 即对传入的参数有类型的校验也对返回的参数有类型的校验
T getData<T>(T value) {
print(value);
return value;
}
//- 对传入的参数有类型的校验,但是对返回的参数没有类型的校验
getData<T>(T value) {
print(value);
return value;
}
void main() {
//- 这两种调用没有类型检测
// getData(21);
// getData("hello");
//- 有类型检测
getData<String>('你好'); //- 传入的参数是字符串,返回的参数也是字符串
getData<int>(20); //- 传入的参数是数字,返回的参数也是数字
}
泛型类
class MyList<T> {
List list = <T>[];
void add(T value) {
this.list.add(value);
}
List getList() {
return list;
}
}
main() {
MyList l = new MyList();
l.add("张三");
l.add(12);
l.add(true);
print(l.getList());
MyList l2 = new MyList<String>(); //- 实例化时指定类型
l2.add("张三");
print(l2.getList());
}
泛型接口
Dart中的泛型接口: 实现数据缓存的功能:有文件缓存、和内存缓存。内存缓存和文件缓存按照接口约束实现。
1、定义一个泛型接口 约束实现它的子类必须有getByKey(key) 和 setByKey(key,value)
2、要求setByKey的时候的value的类型和实例化子类的时候指定的类型一致
abstract class Cache<T> {
getByKey(String key);
void setByKey(String key, T value);
}
class FlieCache<T> implements Cache<T> {
@override
getByKey(String key) {
return key;
}
@override
void setByKey(String key, T value) {
print("key=$key value=$value");
}
}
main() {
FlieCache f = new FlieCache<String>();
f.setByKey("index", "hello");
}