Dart双泛型类场景下smart cast智能类型转换失效如何解决?
问题原因
这是Dart智能类型提升的固有规则限制:对带泛型的参数做类型检查时,编译器需要确认所有泛型参数约束都满足才会触发类型提升。
你定义的Boo<A>是Foo<A, String>的子类,在泛型函数test<A,B>中仅判断foo is Boo<A>时,编译器无法证明泛型参数B和Boo固定的第二个泛型参数String匹配,因此不会对参数foo执行类型提升,调用b()方法就会报错。
可行解决方案
方案1:补充泛型参数匹配判断
在类型判断条件中增加B == String校验,让编译器明确此时B的类型和Boo要求的第二个泛型参数一致,即可正常触发智能转换:
void test<A, B>(Foo<A, B> foo) { if (B == String && foo is Boo<A>) { foo.b(); // 智能转换正常生效 } }
方案2:用局部变量辅助提升
Dart对局部变量的类型提升规则比函数参数更宽松,把参数赋值给局部变量后再做类型判断,也可以触发智能转换:
void test<A, B>(Foo<A, B> foo) { final localFoo = foo; if (localFoo is Boo<A>) { localFoo.b(); // 智能转换正常生效 } }
方案3:显式类型转换(兜底方案)
如果上述方案不适用,可以在确认类型匹配后用as显式转换,不需要删除泛型声明也能正常运行:
void test<A, B>(Foo<A, B> foo) { if (foo is Boo<A>) { (foo as Boo<A>).b(); } }
内容的提问来源于stack exchange,提问作者LeFrosch
相关产品推荐
相关产品推荐

