使用 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 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么泛型胜过 dynamic
- 泛型类和泛型方法
- 使用 extends 限制类型参数
- 实际使用泛型集合