dart总结(四.泛型详解)

前言

没有泛型时:不同的类型检查要写多个方法

String getDetail(String value){
  return value;
}

int getDetail2(int value){
  return value;
}

void main (){
  print(getDetail("aa"));//aa
  print(getDetail2(22));//22
}

使用泛型

好处:可以复用,减少冗余

T getData<T> (T value){//3个T依次表示:返回类型,运行时类型,参数类型
  return value;
}

void main (){
  // 调用时直接在方法名后写上类型即可
  print(getData<String>("aa"));//aa
  print(getData<int>(22));//22
}

类泛型的应用

声明泛型类

 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]);
          }
      }
 }

使用

//没有限制
  PrintClass p=new PrintClass();
  p.add(11);
  p.add('xxx');
  p.add(5);
  p.printInfo();//依次打印11,xxx,5
//限制字符串类型
  PrintClass p=new PrintClass<String>();
  p.add('你好');
   p.add('哈哈');
   //p.add(123);//运行时报错,限制了字符串类型
  p.printInfo();//依次:你好,哈哈
  //限制整型
   PrintClass p=new PrintClass<int>();
  p.add(12);
   p.add(23);
  p.printInfo();//依次:12,23

数组泛型应用

  List list=new List<String>();
  // list.add(12);  //错误写法
  list.add('你好');
  list.add('你好1');
  print(list);//你好,你好1

  List list=new List<int>();
  // list.add("你好");  //错误写法
  list.add(12);
  print(list);//12

泛型接口案例

案例要求:
实现数据缓存的功能:有文件缓存、和内存缓存。内存缓存和文件缓存按照接口约束实现。
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 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(){

 //泛型限定String类型
 MemoryCache m=new MemoryCache<String>();
  m.setByKey('index', '首页数据');//我是内存缓存 把key=index  value=首页数据 -写入到了内存中
 //  m.setByKey('index', 123);//报错

 
 // 泛型限定Map类型
  MemoryCache m=new MemoryCache<Map>();
  m.setByKey('index', {"name":"张三","age":20});//我是内存缓存 把key=index  value={name: 张三, age: 20} -写入到了内存中
 //  m.setByKey('index', '首页数据');//报错
}

你可能感兴趣的:(十八.Flutter)