You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Dart中如何让Extension引用`this`的实际类型?

解决Dart扩展函数返回具体子类类型的问题

问题描述

我有几个数据类型,想要实现一个仅返回this的函数gimmeThis()。目前main()里的代码无法编译,原因是gimmeThis()的返回类型是MyClass。请问该如何修改扩展类,让调用gimmeThis()时返回更具体的子类类型?

原代码:

class MyClass {}
class MySubclass1 extends MyClass {}
class MySubclass2 extends MyClass {}

extension MyClassOperations on MyClass {
  // 怎么把`MyClass`替换成`this`的实际类型?
  MyClass gimmeThis() => this;
}

void main() {
  MySubclass1 sub1 = MySubclass1().gimmeThis();
  MySubclass2 sub2 = MySubclass2().gimmeThis();
}

解决方案

使用泛型扩展,让扩展的目标类型绑定到具体的子类类型,从而让函数返回对应子类的实例:

修改后的代码:

class MyClass {}
class MySubclass1 extends MyClass {}
class MySubclass2 extends MyClass {}

// 泛型扩展,T约束为MyClass的子类,扩展目标为T
extension MyClassOperations<T extends MyClass> on T {
  T gimmeThis() => this;
}

void main() {
  MySubclass1 sub1 = MySubclass1().gimmeThis(); // 编译通过
  MySubclass2 sub2 = MySubclass2().gimmeThis(); // 编译通过
}

原理说明

  • 将扩展定义为泛型MyClassOperations<T extends MyClass>,并把扩展的作用对象从MyClass改为T,这样this的类型就会是调用该扩展的具体子类(比如MySubclass1或MySubclass2)。
  • 函数gimmeThis()的返回类型设为T,Dart会自动推断当前实例的具体类型,无需额外的类型转换,就能直接赋值给对应子类的变量。

内容的提问来源于stack exchange,提问作者Taylor Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:57:40