flutter【8】dart语言--泛型

作者: 昵称真难选 | 来源:发表于2019-01-29 13:53 被阅读9次

泛型

例如基础数组类型,List<E>, 其中的E就是泛型,参数化类型,也可以用其他单个大写字母表示,如 E,T,S,K,V等。

使用泛型可以方便检查工具对代码进行审查

var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
names.add(42); // Error

使用泛型可以减少重复代码

//不用泛型,存储 Object
abstract class ObjectCache {
  Object getByKey(String key);
  void setByKey(String key, Object value);
}
//不用泛型,存储 String
abstract class StringCache {
  String getByKey(String key);
  void setByKey(String key, String value);
}
//使用泛型,则可以省去为每一种类型单独编写代码
abstract class Cache<T> {
  T getByKey(String key);
  void setByKey(String key, T value);
}

List 和 Map 字面量也可以参数化

List参数化在中括号之前添加 <type>,Map 参数化在大括号之前添加 <keyType, valueType>

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'
};

构造方法使用参数化类型

在调用构造方法时,在类名后面使用尖括号,尖括号内填入一个或多个类型来指定泛型。

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

var views = Map<int, View>();

Generic collections and the types they contain

dart 中的泛型是固化的,就是在运行时可以判断其具体类型。

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

注意 is 表达式只是判断集合的类型,而不是集合里面具体对象的类型。在生产模式,List<String> 变量可以包含非字符串类型对象。对于这种情况,可以选择分别判断每个对象的类型或者处理类型转换异常 (参考 Exceptions)。

注意:Java 中的泛型信息是编译时的,泛型信息在运行时是不纯在的。在 Java 中你可以测试一个对象是否为 List,但是无法测试一个对象是否为List<String>。

限制泛型类型

使用关键字 extends 限制参数的类型

class Foo<T extends SomeBaseClass> {
  // Implementation goes here...
  String toString() => "Instance of 'Foo<$T>'";
}

class Extender extends SomeBaseClass {...}

//使用时可以传入 SomeBaseClass 或者其子类
var someBaseClassFoo = Foo<SomeBaseClass>();
var extenderFoo = Foo<Extender>();

//也可以不传入参数,默认为 SomeBaseClass
var foo = Foo();
print(foo); // Instance of 'Foo<SomeBaseClass>'

//传入其他类型的参数则会报错
var foo = Foo<Object>();//error

泛型方法

需要dart1.2.1以上版本才可以使用泛型方法

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).

相关文章

  • flutter【8】dart语言--泛型

    泛型 例如基础数组类型,List, 其中的E就是泛型,参数化类型,也可以用其他单个大写字母表示,如 E,T,...

  • Dart基础(八)-泛型

    1.简介:   Dart语言是强类型语言,强类型语言都支持泛型Generics。那么什么是泛型呢?泛型是指代码在使...

  • Flutter/Dart - 泛型

    泛型的定义 通俗理解:泛型就是解决类,接口,方法的复用性、以及对不特定数据类型的支持(类型校验) 接下来我们实现一...

  • Dart语言简介 2019-03-18

    标签(空格分隔): Dart Flutter Dart在静态语法方面和Java非常相似,如类型定义、函数声明、泛型...

  • Flutter(七) Dart语言基础-枚举&泛型

    枚举 枚举的定义 枚举使用enum关键字来进行定义: 枚举的属性 枚举类型中有两个比较常见的属性: index: ...

  • Flutter系列(2)Dart语言基础

    Flutter的开发语言是Dart语言的,这篇文章就说说Dart语言基础 一、Dart 初体验 在flutter项...

  • Dart 基础

    为什么学习dart?谷歌推出了flutter,而flutter是基于dart语言的 dart是函数式编程语言 所有...

  • Dart语言 5 泛型

    限制泛型参数类型实现泛型类型时,您可能希望限制其参数的类型。 您可以使用扩展来执行此操作。 这样可以使用SomeB...

  • Dart 语言泛型Generic

    generic 泛型 泛型在现代面向对象语言中有很重要的地位。为什么要发明泛型这个概念呢? 维基百科上认为要加强安...

  • Dart语言学习第一天

    1.Flutter是基于Dart 语言,使用Flutter框架需要了解Dart语言。 2.Dart官网地址:htt...

网友评论

    本文标题:flutter【8】dart语言--泛型

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