美文网首页
Dart基础(八)-泛型

Dart基础(八)-泛型

作者: 苍眸之宝宝 | 来源:发表于2022-01-11 10:54 被阅读0次

    1.简介:

      Dart语言是强类型语言,强类型语言都支持泛型Generics。那么什么是泛型呢?
    泛型是指代码在使用时才指定类型,即在实例化时作为参数指明这些类型
    的设计模式。泛型的参数代表类的类型,而不是函数参数是类的某个实例。

    2.Dart中的泛型及使用:

    在 API 文档中你会发现基础数组类型List的实际类型是List<E>。 <…> 符号将 List 标记为 泛型 (或 参数化) 类型。 这种类型具有形式化的参数。 通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。

    泛型的定义:

    • 使用<...>定义传入的泛型;
    • ...通常使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等,只是传入类的一个占位符;
    abstract class List<E> implements EfficientLengthIterable<E> 
    

    3.泛型的优点:

    • 正确地指定泛型类型可以生成更好的代码;
    • 泛型来减少很多重复的代码;
    • 泛型可以在多种类型之间定义同一个实现;
    • 泛型使用时可以静态检查和推断类型,如果不符合泛型类型,会报编译错误。
    // 静态检查和推断类型,类型不符,报错
    var names = <String>[];
    names.addAll(['Seth', 'Kathy', 'Lars']);
    names.add(42); // Error
    
    // 减少重复代码,定义同一实现
    abstract class ObjectCache {
      Object getByKey(String key);
      void setByKey(String key, Object value);
    }
    
    abstract class StringCache {
      String getByKey(String key);
      void setByKey(String key, String value);
    }
    
    // 上边的两个类,可以用下面的一个泛型类进行代替
    abstract class Cache<T> {  // T是替代类型。它是一个占位符,您可以将其视为开发人员稍后将定义的类型。
      T getByKey(String key);
      void setByKey(String key, T value);
    }
    

    4.泛型在集合中的使用:

    4.1定义集合泛型变量:
    var names = <String>['Seth', 'Kathy', 'Lars'];
    var uniqueNames = <String>{'Seth', 'Kathy', 'Lars'};
    var pages = <String, String>{
      'index.html': 'Homepage',
      'robots.txt': 'Hints for web robots',
      'humans.txt': 'We are people, not machines'
    };
    
    4.2集合泛型的构造函数:
    var nameSet = Set<String>.from(names);
    var views = Map<int, View>();
    var names = <String>[];
    names.addAll(['Seth', 'Kathy', 'Lars']);
    print(names is List<String>); // true
    
    4.3限制泛型参数类型:

      使用<T extends ClassName>限制泛型传入的类的类型,表示传入的类必须是ClassName的类及其子类,传入其它类会报错。
      泛型<T>与<T extends Object?>等价。

    // 限制传入泛型类的类型为SomeBaseClass类及其子类
    class Foo<T extends SomeBaseClass> {
      // Implementation goes here...
      String toString() => "Instance of 'Foo<$T>'";
    }
    
    class Extender extends SomeBaseClass {...}
    
    //
    var someBaseClassFoo = Foo<SomeBaseClass>();
    var extenderFoo = Foo<Extender>();
    var foo = Foo();
    print(foo); // Instance of 'Foo<SomeBaseClass>'
    
    var foo = Foo<Object>();  // 报错,Object不是SomeBaseClass的类及其子类
    

    5.泛型方法generic methods的使用:

      最初,Dart的泛型只支持类的泛型。后续,又支持了方法的泛型,叫做泛型方法。

    T first<T>(List<T> ts) {
      // Do some initial work or error checking, then...
      T tmp = ts[0];
      // Do some additional checking or processing...
      return tmp;
    }
    

      上述代码的方法first<T>中的T表示传入的泛型参数类的类型:

    • 函数的返回类型为T
    • 函数的参数类型为List<T>
    • 在一个局部变量T tmp的类型。

    相关文章

      网友评论

          本文标题:Dart基础(八)-泛型

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