为何无法从泛型类的工厂构造函数返回特定子类?
Dart泛型工厂构造函数报错问题解析
问题场景
用静态方法实现的“工厂逻辑”能正常编译:
class Base<T> { Base(); static Base myFactory(bool isInt) { if (isInt) { return A(); } else { return B(); } } } class A extends Base<int> {} class B extends Base<String> {}
但换成工厂构造函数语法就会触发错误:
class Base<T> { Base(); factory Base.myFactory(bool isInt) { if (isInt) { return A(); } else { return B(); } } } class A extends Base<int> {} class B extends Base<String> {}
错误提示:
A value of type 'A' can't be returned from the method 'myStatic' because it has a return type of 'Base
'.
疑问:A是Base<int>的子类,难道不是泛型Base<T>的子类吗?
原因解析
Dart泛型默认是不变性的:
Base<int>和Base<String>既不是彼此的子类,也不属于Base<T>(这里的T是当前泛型类的类型参数)的子类范畴。工厂构造函数Base.myFactory属于Base<T>这个泛型类,它的返回类型被固定为Base<T>——但你返回的A是Base<int>,无法适配任意的T。比如如果有人调用Base<double>.myFactory(true),返回的Base<int>和Base<double>类型完全不兼容,编译器会直接报错阻止这种不安全的行为。静态方法的情况不同:静态
myFactory的返回类型是原始类型Base(不带泛型参数),Dart中使用原始类型时会启用类型弱化,编译器放松了泛型类型检查,允许返回任意Base的子类实例,所以能通过编译,但这种写法存在安全隐患,运行时可能引发类型错误。核心差异:工厂构造函数和泛型类的具体类型参数绑定,必须返回对应
Base<T>的实例;静态方法脱离了具体的泛型实例,使用原始类型时没有严格的泛型约束。
内容的提问来源于stack exchange,提问作者Anakhand
相关产品推荐
相关产品推荐

