在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
相关产品推荐
相关产品推荐

