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

Dart Mixin如何访问并返回其宿主类?

在Dart Mixin中返回宿主类实例的实现方法

你可以通过类型转换让Mixin返回宿主类实例,核心是明确this在运行时就是宿主类的实例,只需通过as关键字让编译器认可这个类型。

修正后的代码

class Foo<T extends String> extends SuperClass<T> with MyMixin<T, Foo> {
  Foo(value) : super(value);
}

class Bar<T extends int> extends SuperClass<T> with MyMixin<T, Bar> {
  Bar(value) : super(value);
}

abstract class SuperClass<T> {
  final T value;
  SuperClass(this.value);
}

mixin MyMixin<T, U extends SuperClass<T> with MyMixin<T, U>> on SuperClass<T> {
  U? doSomethingOrNull() {
    return value is String ? null : this as U;
  }
}

关键说明

  1. 类型转换的合理性:当Mixin被宿主类(如Foo、Bar)混入时,this的运行时类型就是宿主类实例,只是静态类型被推导为SuperClass<T> with MyMixin<T,U>。通过this as U可以完成静态类型的转换,让编译器接受返回值为宿主类类型。
  2. 泛型约束优化:给U添加extends SuperClass<T> with MyMixin<T, U>的约束,能在编译阶段就限制U必须是混入了当前Mixin的SuperClass子类,避免传入错误的类型参数。

简化版本(如果不需要严格约束)

如果不需要编译期的类型约束,也可以直接做类型转换:

mixin MyMixin<T, U> on SuperClass<T> {
  U? doSomethingOrNull() {
    return value is String ? null : this as U;
  }
}

这种写法更简洁,只要你确保传入的U确实是宿主类的类型,运行时就不会出现类型转换错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:05:03