Dart 语言基础入门篇( 六 )

在Java中,泛型是通过类型擦除来实现的,但在Dart中实打实的泛型:
var names = <String>[]; names.addAll(['Tom',"Cat"]); // is 可以用于类型判断 print(names is List<String>); // true print(names is List); // true print(names is List<int>); //false你可以通过extends关键词来限制泛型类型,这点和Java一样:
abstract class Animal{}class Cat extends Animal{}class Ext<T extends Animal>{T data;}void main() {var e = Ext(); // okvar e1 = Ext<Animal>(); // okvar e2 = Ext<Cat>(); // okvar e3 = Ext<int>(); // compile error}使用类库有生命力的编程语言,它背后都有一个强大的类库,它们可以让我们站在巨人的肩膀上,又免于重新造轮子 。
导入类库在Dart里面,通过import关键词来导入类库 。
内置的类库使用dart:开头引入:
import 'dart:io';了解更多内置的类库可以查看这里 。
第三方类库或者本地的dart文件用package:开头:
比如导入用于网络请求的dio库:
import 'package:dio/dio.dart';Dart 应用本身就是一个库,比如我的应用名是ccsys,导入其他文件夹的类:
import 'package:ccsys/common/net_utils.dart';import 'package:ccsys/model/user.dart';如果你使用IDE来开发,一般这个事情不用你来操心,它会自动帮你导入的 。
Dart 通过pub.dev来管理类库,类似Java世界的Maven 或者Node.js的npm一样,你可以在里面找到非常多实用的库 。
解决类名冲突如果导入的类库有类名冲突,可以通过as使用别名来避免这个问题:
import 'package:lib1/lib1.dart';import 'package:lib2/lib2.dart' as lib2;// 使用来自 lib1 的 ElementElement element1 = Element();// 使用来自 lib2 的 Elementlib2.Element element2 = lib2.Element();导入部分类在一个dart文件中,可能会存在很多个类,如果你只想引用其中几个,你可以增加show或者hide来处理:
//文件:my_lib.dartclass One {}class Two{}class Three{}使用show导入One和Two类:
//文件:test.dartimport 'my_lib.dart' show One, Two;void main() {var one = One();var two = Two();//compile errorvar three = Three();}也可以使用hide排除Three,和上面是等价的:
//文件:test.dartimport 'my_lib.dart' hide Three;void main() {var one = One();var two = Two();}延迟加载库目前只有在web app(dart2js)中才支持延迟加载,Flutter、Dart VM是不支持的,我们这里仅做一下简单介绍 。
你需要通过deferred as来声明延迟加载该类库:
import 'package:greetings/hello.dart' deferred as hello;当你需要使用的时候,通过loadLibrary()加载:
Future greet() async {await hello.loadLibrary();hello.printGreeting();}你可以多次调用loadLibrary,它不会被重复加载 。
异步支持这个话题稍微复杂,我们将用另外一篇文章独立讨论这个问题,请留意下一篇内容 。
参考资料

  1. 学习Dart的十大理由
  2. A tour of the Dart language
  3. Dart 常量构造器的理解
  4. JavaScript 闭包
关于AgileStudio我们是一支由资深独立开发者和设计师组成的团队,成员均有扎实的技术实力和多年的产品设计开发经验,提供可信赖的软件定制服务 。

【Dart 语言基础入门篇】


推荐阅读