使用重定向构造函数时如何使用类型参数?
问题原因
你写的代码报错,是因为Foo.zero()作为泛型类Foo<T>的命名构造函数,它默认和当前类的泛型参数T绑定,没法在初始化列表里给this._显式指定另一个泛型类型(比如int)。Dart的构造函数初始化列表不支持这种写法。
解决办法
把zero改成工厂构造函数就行,这样能直接返回指定泛型类型的实例,完全不用类型转换:
class Foo<T extends num> { final T t; Foo._(this.t); factory Foo.zero() { return Foo._<int>(0); } }
现在调用Foo.zero()会直接得到Foo<int>类型的实例,完全符合你想直接用int类型参数的要求。
如果之后需要支持其他数字类型的零值,还可以给工厂构造函数加个带默认值的可选泛型参数:
class Foo<T extends num> { final T t; Foo._(this.t); factory Foo.zero<U extends num = int>() { return Foo._<U>(0 as U); // 这里的类型转换是安全的,因为U是num的子类,0是所有数字类型的合法零值 } } // 调用示例 void main() { var intZero = Foo.zero(); // 默认生成Foo<int>实例 var doubleZero = Foo.zero<double>(); // 显式生成Foo<double>实例 }
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

