美文网首页
Dart 笔记 11 - 泛型

Dart 笔记 11 - 泛型

作者: 三流之路 | 来源:发表于2019-01-17 18:40 被阅读0次

    泛型类

    abstract class Cache<T> {
      T getByKey(String key);
      void setByKey(String key, T value);
    }
    

    List 和 Map 字面量可以被参数化。参数化字面量就是在字面量的开始括号之前添加 <type>(对于 List)或者添加 <keyType, valueType>(对于 Map)。

    var names = <String>['Seth', 'Kathy', 'Lars'];
    var pages = <String, String>{
      'index.html': 'Homepage',
      'robots.txt': 'Hints for web robots',
      'humans.txt': 'We are people, not machines'
    };
    

    要在使用构造函数时指定一个或多个类型,将类型放在类名后面的尖括号中。和 Java 一样。

    var names = List<String>();
    names.addAll(['Seth', 'Kathy', 'Lars']);
    var nameSet = Set<String>.from(names);
    

    Dart 通用类型被具体化,意味着它们在运行时携带它们的类型信息。

    var names = List<String>();
    names.addAll(['Seth', 'Kathy', 'Lars']);
    print(names is List<String>); // true
    

    限制类型

    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(); // 不指定泛型就是 SomeBaseClass
    print(foo); // Instance of 'Foo<SomeBaseClass>'
    
    var foo = Foo<Object>(); // 报错
    

    泛型方法

    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 笔记 11 - 泛型

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