8.Generics 泛型(Dart中文文档)
- 这篇翻译的不好
如果你看API文档中的数组篇,你会发现类型一般写成List.<...>的写法表示通用类型的数组(未明确指定数组中的数据类型)。通常情况泛型类型用E,T,S,K,V表示。
Why use generics? 为什么用泛型
泛型是类型安全的(意思是你必须指定数据的类型),但是它的写法比硬编码指定类型高效的多:
- Properly specifying generic types results in better generated code.
- 减少重复代码
如果你想让数组只有String值,定义为List。这样,后续代码中,如果给数组赋值了非String类型,编译器将提示报错,
var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
names.add(42); // Error
另一个使用泛型是原因是为了减少重复代码。泛型让你通过一个单一类可以适配多种类型的数据操作,同时可以进行静态代码检查(比如,类型安全检查)。
abstract class ObjectCache {
Object getByKey(String key);
void setByKey(String key, Object value);
}
上面代码是对Object类型操作,在没用泛型的情况下,你想对String类型操作,就得重新定义一个类
abstract class StringCache {
String getByKey(String key);
void setByKey(String key, String value);
}
后面,你如果相对num类型操作,还得重新定义一个类。
而泛型就可以解决上面的问题,它通过对类型参数化,实现一个类针对多种数据类型操作的适配。
abstract class Cache<T> {
T getByKey(String key);
void setByKey(String key, T value);
}
Using collection literals 使用集合
List和map的字面量
List和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'
};
Using parameterized types with constructors 构造器中使用类型参数
var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
var nameSet = Set<String>.from(names);
下面是map的泛型构造写法:
var views = Map<int, View>();
Generic collections and the types they contain
Dart的泛型类型是在运行时绑定的,这样,在运行时,可以知道List内具体类型。
var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List<String>); // true
注意:java中,泛型是采用擦除的方式,它在运行时,其实对象都是Object类型或者泛型的约束父类。
Restricting the parameterized type
当泛型时,希望限制参数的类型范围,可以用extends关键字约束。
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>();
Using generic methods 泛型方法
Initially, Dart’s generic support was limited to classes. A newer syntax, called generic methods, allows type arguments on methods and functions:
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;
}
下面是允许使用泛型方法的场景:
In the function’s return type (T).
In the type of an argument (List).
In the type of a local variable (T tmp).
8.Generics 泛型(Dart中文文档)的更多相关文章
- 2.Built-in types-基本数据类型(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart语言内置如下数据类型: numbers strings booleans lists (所谓的数组) maps ...
- 1.Variables-变量(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. 如下是变量定义和赋值的示例 var name = 'Bob'; 变量存储的是一个引用地址.如上的变量name指向了一个值 ...
- 7.Classes-类(Dart中文文档)
Dart是一个面向对象的语言,同时增加了混入(mixin)继承的特性.对象都是由类初始化生成的,所有的类都由Object对象继承.混入继承意味着尽管所有类(除了Object类)只有一个父类,但是类的代 ...
- 6.Exceptions-异常(Dart中文文档)
异常是用于标识程序发生未知异常.如果异常没有被捕获,If the exception isn't caught, the isolate that raised the exception is su ...
- 5.Control flow statements-流程控制(Dart中文文档)
你可以使用如下流程控制符: if and else for loops while and do-while loops break and continue switch and case asse ...
- 4.Operators-操作符(Dart中文文档)
Dart有如下操作符: Description Operator unary postfix expr++ expr-- () [] . ?. unary prefix -expr !expr ~ex ...
- 3.Functions-函数(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart是完全的面向对象的语言,甚至函数也是一个Function类型的对象.这意味着函数可以赋值给变量或者作为函数的参数 ...
- Flutter 中文文档网站 flutter.cn 正式发布!
在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...
- Reactor3 中文文档(用户手册)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
随机推荐
- java基础(八) 深入解析常量池与装拆箱机制
引言 本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体, ...
- LeetCode 题解之Plus One
1.题目描述 2.题目分析 从后向前做加法,等于10则进位,否则直接加1 ,返回 digits; 3.代码 vector<int> plusOne(vector<int>&am ...
- scrapy实战--登陆人人网爬取个人信息
今天把scrapy的文档研究了一下,感觉有点手痒,就写点东西留点念想吧,也做为备忘录.随意写写,看到的朋友觉得不好,不要喷我哈. 创建scrapy工程 cd C:\Spider_dev\app\scr ...
- mysql root更改远程登录
mysql> select user,host from mysql.user; +---------------+-------------+ | user | host | +------- ...
- 【Kettle】2、文件夹与界面介绍
1.文件夹介绍 下载Kettle6.1解压后出现下图相关文件夹以及文件夹介绍说明: Lib:存放Kettle的核心(core)jar包.工作引擎(engine)jar包.数据库(DB) jar包.图形 ...
- RHEL7: How to configure a rc-local service
问题: linux7 /etc/rc.local 不生效: [root@bogon mysql3306]# uname -aLinux bogon 3.10.0-862.el7.x86_64 #1 S ...
- [C++] 用Xcode来写C++程序[6] Name visibility
用Xcode来写C++程序[6] Name visibility 此小结包括了命名空间的一些使用细节 命名空间 #include <iostream> using namespace st ...
- 搭建企业级NFS网络文件共享服务说明[一]
1.1.0. 概述: 共享/NFS目录给整个192.168.25.0/24网段主机读写 man nfs 可以查看mount的信息 rpc端口111 nfs主端口2049 1.1.1. 搭建NFS环境 ...
- firewalld防火墙简单理解总结(一)
参考文章:https://linux.cn/article-8098-1.html https://linux.cn/article-9073-1.html #多区域使用示例,重点参考 前言 防火 ...
- Promise & Deferred objects in JavaScript Pt.1: Theory and Semantics.
原文:http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt1-theory-and-semanti ...