Dart在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
测试用的要什么简介 发布于:2024-04-10 14:20 数组随机数 发布于:2024-02-25 15:24 测试dart特性代码 发布于:2024-02-21 15:36 判断坐标点是否在围栏区域 发布于:2023-11-18 12:02 测试根据数值分组 发布于:2023-11-04 23:05 dart 快速排序 发布于:2023-04-23 18:18 二叉树中序遍历 发布于:2023-04-13 16:12 寻找两个顺序数组的中位数 发布于:2023-03-17 17:47 卡尔曼滤波 发布于:2023-03-02 18:23 my dart training 发布于:2023-02-21 18:35 Dart实现RFID标签写入 发布于:2023-02-01 12:15 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1] 提示: 每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零 发布于:2022-12-12 15:43 迷宫图测试功能 发布于:2022-03-16 09:33 Dart Test 发布于:2022-03-07 15:38 Dart 生成过去30天的日期,无论是什么时候 发布于:2021-11-29 10:41 dart学习 发布于:2020-10-10 18:59 dart学习 发布于:2020-10-10 18:59 dart学习 发布于:2020-09-29 14:36 [更多]
显示目录

泛型



学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场

泛型

是指泛类型,就是说类型可以延迟到使用时候再决定,而非声明时决定 在 API 文档中你会发现基础数组类型 List 的实际类型是 List 。 <…> 符号将 List 标记为 泛型 (或 参数化) 类型。 这种类型具有形式化的参数。 通常情况下,使用一个字母来代表类型参数, 例如 E, T, S, K, 和 V 等。

为什么使用泛型

正确指定泛型类型可以提高代码质量,减少重复的代码。 在类型安全上通常需要泛型支持, 它的好处不仅仅是保证代码的正常运行:

如果想让 List 仅仅支持字符串类型, 可以将其声明为 List(String)(读作“字符串类型的 list ”)。当一个非字符串被赋值给了这个 list 时,开发工具就能够检测到这样的做法可能存在错误。 例如:

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

减少重复的代码是另外一个使用泛型的原因。 在多种类型之间泛型可以定义同一个实现, 同时还可以继续使用检查模式和静态分析工具提供的代码分析功能。假设你创建了一个用于缓存对象的接口:

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 getByKey(String key);
  void setByKey(String key, T value);
}

T 在上面的代码中是一个备用类型。 这是一个类型占位符,在开发者调用该接口的时候会指定具体类型。

使用集合字面量 参数化字面量List , Set 和 Map 也可以。 参数化字面量和之前的字面量定义类似, 对于 List 或 Set 只需要在声明语句前加 前缀, 对于 Map 只需要在声明语句前加 前缀, 下面是参数化字面量的示例:

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

使用泛型类型的构造函数

在调用构造函数时,在类名字后面使用尖括号(<...>)来指定泛型类型。 例如:

var nameSet = Set<String>.from(names);

下面代码创建了一个 key 为 integer, value 为 View 的 map 对象:

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

运行时中的泛型集合

Dart 中泛型类型在运行时是携带着类型信息的,是固化的。 例如, 在运行时检测集合的类型:

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

在Java中,可以测试对象是否为 List 类型, 但无法测试它是否为 List 。Java中的泛型会被 擦除 ,运行时泛型类型参数的信息是不存在的。

限制泛型类型

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>();

也可以不指定泛型参数:

var foo = Foo();
print(foo); // Instance of 'Foo<SomeBaseClass>'

指定任何非 SomeBaseClass 类型会导致错误:

var foo = Foo<Object>();

使用泛型函数

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). 参数的类型 (List). 局部变量的类型 (T tmp).

由JSRUN为你提供的Dart在线运行、在线编译工具
        JSRUN提供的Dart 在线运行,Dart 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout