为什么Dart中子类型无法赋值给<T extends 基类>约束的泛型变量
核心原因:泛型上界约束的不确定性与Dart类型系统检查
首先明确代码中的泛型规则:
Test<T extends User>的含义是:泛型参数T的实际取值可以是User本身,也可以是它的任意子类(包括Student、Teacher),T的具体类型只有在Test类被实例化的时候才会最终确定,类定义阶段是未知的。
为什么Future<T> fut = Future.value(Student())会报错
你在类定义阶段就固定给Future<T>类型的变量赋值了一个Future<Student>类型的实例,但T的实际取值完全可以不是Student:比如实例化Test的时候可以写Test<Teacher> test = Test<Teacher>(),这时候T的实际类型是Teacher,Future<Student>和Future<Teacher>是完全不兼容的类型,赋值会出现类型错误。Dart编译器在类定义阶段就能检测到这个潜在的类型风险,所以直接抛出编译错误。
为什么Future<User> fut2 = Future.value(Student())可以正常运行
这里变量的类型是固定的Future<User>,不存在泛型参数的不确定性。Dart的泛型是协变的,也就是说如果A是B的子类,那么Future<A>就属于Future<B>的子类型。Student是User的子类,所以Future<Student>完全可以赋值给Future<User>类型的变量,符合类型系统的约束,不会有任何问题。
内容的提问来源于stack exchange,提问作者manikanta
相关产品推荐
相关产品推荐

