美文网首页
Dart学习笔记07-泛型

Dart学习笔记07-泛型

作者: zombie | 来源:发表于2020-08-17 14:01 被阅读0次

    在 API 文档中你会发现基础数组类型 List 的实际类型是 List<E> 。 <…> 符号将 List 标记为 泛型 类型。 这种类型具有形式化的参数。 通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。
    使用泛型的好处:可以提高代码质量 可以减少重复的代码

    1.List和Map的泛型

    • List使用时的泛型写法:
    var name1 = ['wang', 'liu', 'zhao', 111];
    print(name1.runtimeType); // List<Object>
    // 限制类型
    var name2 = <String>['wang', 'liu', 'zhao'];
    List<String> name3 = ['wang', 'liu', 'zhao'];
    print(name2.runtimeType); // List<String>
    print(name3.runtimeType); // List<String>
    
    • Map使用时的泛型写法
    var info1 = {1: 'one', 'name': 'wang', 'age': 18};
    print(info1.runtimeType); // _InternalLinkedHashMap<Object, Object>
    var info2 = <String, String>{'name': 'wang'};
    Map<String, String> info3 = {'name': 'wang'};
    print(info2.runtimeType); // _InternalLinkedHashMap<String, String>
    print(info3.runtimeType); // _InternalLinkedHashMap<String, String>
    

    2.类定义的泛型

    • 当定义一个类时不确定属性的类型时,这时可以使用泛型
      代码示例:
    class Location1<T> {
      T x;
      T y;
    
      Location1(this.x, this.y);
    }
    
    Location1 l1 = Location1<int>(10, 20);
    print(l1.x.runtimeType); // int
    
    Location1 l2 = Location1<String>('aaa', 'bbb');
    print(l2.x.runtimeType); // String
    

    希望类型只能是num类型时:

    class Location2<T extends num> {
      T x;
      T y;
    
      Location2(this.x, this.y);
    }
    
    Location2 l4 = Location2<int>(10, 20);
    print(l4.x.runtimeType); // int
    
    // 错误的写法, 类型必须继承自num
    // Location2 l4 = Location2<String>('aaa', 'bbb');
    // print(l4.x.runtimeType);
    

    3.泛型方法的定义

    T getFirst<T>(List<T> ts) {
      return ts[0];
    }
    
    var names = ['wang', 'liu'];
    var first = getFirst(names);
    print('$first ${first.runtimeType}'); // wang String
    

    相关文章

      网友评论

          本文标题:Dart学习笔记07-泛型

          本文链接:https://www.haomeiwen.com/subject/gbeuohtx.html