Dart中无法对泛型变量执行赋值操作的原因是什么?
报错核心原因
Dart 泛型参数的具体类型是在函数被调用时由使用者指定的,你写的extends 上界只是限制了泛型参数的类型范围,不代表泛型参数本身等同于上界类型:
- 针对
T1 extends num的报错:T1可以是任意符合num子类型的类型,比如调用时使用者可以指定T1为double,此时你把int类型的0赋值给double类型的变量显然不合法,编译器会提前拦截这种类型安全风险。 - 针对
T2 extends String的报错:和上面逻辑一致,T2是String的子类型(即使Dart中String默认没有自定义子类,泛型约束下T2依然是独立于String的类型),直接把String类型的Test赋值给T2类型变量不符合类型安全要求。
解决方法
根据你的实际业务场景选择对应方案:
- 不需要泛型能力的场景,直接删掉不必要的泛型声明,用具体类型声明变量/参数即可:
void test(String arg) { int t = 0; arg = 'Test'; }
- 必须保留泛型约束的场景,如果你能保证运行时类型一定匹配,可以通过显式类型转换
as处理:
void test<T1 extends num, T2 extends String>(T2 arg) { T1 t = 0 as T1; arg = 'Test' as T2; }
- 要避免
as带来的运行时崩溃风险,可以加类型判断做适配处理:
void test<T1 extends num, T2 extends String>(T2 arg) { T1 t; if (T1 == int) { t = 0 as T1; } else if (T1 == double) { t = 0.0 as T1; } else { t = 0 as T1; } if (T2 == String) { arg = 'Test' as T2; } }
内容的提问来源于stack exchange,提问作者Ayad Salim
相关产品推荐
相关产品推荐

