泛型的定义
通俗理解:泛型就是解决类,接口,方法的复用性、以及对不特定数据类型的支持(类型校验)
接下来我们实现一个方法 传入什么,返回什么。
T getData<T>(T value){
return value;
}
main(){
print(getData<Int>(22))
print(getData<String>('XXX'))
}
泛型类
集合list 就是泛型类的用法
main(){
List list = new List<String>();
list.add(12)//错误的写法
list.add('12')
}
- 自定义泛型类
把下面类转换成泛型类,要求List里面可以增加int类型的数据,也可以增加string类型的数据。
class PrintClass{
List list = new List<int>();
void add(int value){
this.list.add(value);
}
void printInfo(){
for(var i=0;i<this.list.length;i++){
print(this.list[i]);
}
}
}
转换为:
class PrintClass<T>{
List list = new List<T>();
void add(T value){
this.list.add(value);
}
void printInfo(){
for(var i=0;i<this.list.length;i++){
print(this.list[i]);
}
}
}
main() {
PrintClass p = new PrintClass();
p.add(1);
p.add('12');
p.printInfo();
PrintClass p2 = new PrintClass<int>();
p2.add(1);
p2.printInfo();
PrintClass p3 = new PrintClass<int>();
p3.add('23');
p3.printInfo();
}
泛型接口
官方文档示例
abstract class ObjectCache {
getByKey(String key);
void setByKey(String key, Object value);
}
abstract class StringCache {
getByKey(String key);
void setByKey(String key, Object value);
}
abstract class Cache<T> {
getByKey(String key);
void setByKey(String key, T value);
}
接下来我们 实现数据缓存的功能:有文件缓存和内存缓存。内存缓存和文件缓存按照接口约束实现
- 1.定义一个泛型接口,约束实现他的子类必须有getByKey(key)和setByKey(key,value)
- 2.要求setbykey的时候的value的类型和实例化子类的时候指定的类型一致
abstract class Cache<T> {
getByKey(String key);
void setByKey(String key, T value);
}
//文件缓存
class FileCache<T> implements Cache<T> {
@override
getByKey(String key) {
return null;
}
@override
void setByKey(String key, T value) {
print('我是文件缓存,将key=${key}---value=${value}写到内存中');
}
}
//内存缓存
class MemoryCache<T> implements Cache<T> {
@override
getByKey(String key) {
return null;
}
@override
void setByKey(String key, T value) {
print('我是内存缓存,将key=${key}---value=${value}写到内存中');
}
}
void main() {
MemoryCache m = new MemoryCache<String>();
// m.setByKey('index', 123);//会报错,因为这里创建类时定义为String类型
m.setByKey('index', '123'); //正常输出
MemoryCache m2 = new MemoryCache<Map>();
// m.setByKey('index', 123);//会报错,因为这里创建类时定义为String类型
m.setByKey('index', {'name': 'hhh', 'age': 20}); //正常输出
}
网友评论