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; } }
关键说明
- 类型转换的合理性:当Mixin被宿主类(如
Foo、Bar)混入时,this的运行时类型就是宿主类实例,只是静态类型被推导为SuperClass<T> with MyMixin<T,U>。通过this as U可以完成静态类型的转换,让编译器接受返回值为宿主类类型。 - 泛型约束优化:给
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
相关产品推荐
相关产品推荐

