0Pricing
Dart Academy · 课时

使用 extends 限制类型参数

限制泛型可以接受的类型

使用 extends 限制类型参数 是 CoddyKit 上的免费 Dart Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Dart Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Dart Academy 课程共包含 4 节课。

类型为任意值有时不够

普通类型参数可以接受所有类型,但有时您需要更多限制。您可能需要调用只有某些类型才提供的方法。🔒

使用 extends 设置边界

您可以使用 extends 添加边界。这表示类型参数必须是指定类型,或是该类型的子类型。

class Cage<T extends Animal> {}

边界提供的保证

在类的内部,Dart 现在可以确定 T 至少是 Animal。因此,您可以安全地使用 Animal 定义的任何成员。

class Cage<T extends Animal> {
  void feed(T a) => a.eat();
}

拒绝错误类型

编译器会阻止任何不满足边界的类型参数。传入无关类型会立即产生错误。

Cage<String>();

数值边界

常见的边界是 num,它是 int 和 double 的父类型。这样,泛型可以执行算术运算,同时接受这两种数值类型。

T addOne<T extends num>(T x) => x + 1 as T;

方法上的边界

边界同样适用于泛型方法,而不仅是类。请在方法的类型参数名称后直接放置 extends。

num biggest<T extends num>(List<T> xs) =>
    xs.reduce((a, b) => a > b ? a : b);

默认边界是 Object

省略边界时,隐式边界是 Object?。因此,未设置边界的 T 只能使用每个对象都拥有的成员。

Comparable 边界

要进行排序或比较,请将类型绑定到 Comparable。这样,您就可以在泛型代码中的值上调用 compareTo。

T max<T extends Comparable<T>>(T a, T b) =>
    a.compareTo(b) >= 0 ? a : b;

边界说明意图

边界还会告诉读者这里适合哪些类型。签名本身就解释了代码所要求的契约。

自引用边界

请注意,T 可以出现在自己的边界中,例如 T extends Comparable<T>。这种模式将类型与针对自身的操作关联起来。

保持边界最小化

请使用仍能满足需求的最宽松边界。过度限制会排除有效类型,而完全不设置边界又会让有用的方法无法访问。

快速检查

在类的内部,边界允许您做什么?

回顾

您使用 extends 为类型参数设置了边界,从而解锁了边界类型的方法,并拒绝无关类型。请根据任务需要保持边界足够宽松。✅

常见问题解答

「使用 extends 限制类型参数」课时是免费的吗?

是的 — 「使用 extends 限制类型参数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Dart Academy 课程的其余内容,请升级到 CoddyKit PRO。 Dart Academy 课程共包含 4 节课。

「使用 extends 限制类型参数」这节课中我会学到什么?

限制泛型可以接受的类型 你通过在浏览器中直接运行的动手代码来练习 Dart Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Dart Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Dart Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 extends 限制类型参数」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Dart Academy 课中编写并运行代码吗?

能。每节 Dart Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么泛型胜过 dynamic
  2. 泛型类和泛型方法
  3. 使用 extends 限制类型参数
  4. 实际使用泛型集合
← 返回 Dart Academy