Dart扩展出现「int类型无法赋值给int类型」报错的原因是什么?
问题根源
你写的扩展代码里的<int>属于泛型参数命名冲突导致的类型遮蔽问题:
- 跟在扩展名称
MyExtension后的<int>并不是你以为的「指定扩展绑定int类型」的语法,而是你为这个扩展声明了一个名称为int的泛型参数,这个名字直接覆盖了Dart SDK内置的int基础类型在该扩展作用域内的指代。 - 你在方法内写的
int a = 1里,左侧的int实际指向你自定义的这个未知泛型参数,右侧的1才是Dart内置的整数类型值,二者属于完全不同的类型,所以会触发赋值不兼容的报错。编译器提示里看似相同的两个int,本质上一个是你命名的泛型占位符,一个是内置类型,并不存在逻辑矛盾。
为什么删除<int>后恢复正常
你当前的扩展本身就是固定作用在List<int>类型上的,不需要额外声明泛型参数。删除<int>后,扩展作用域内的int标识符会恢复指代Dart内置的整数类型,类型匹配自然不会报错。
拓展:泛型扩展的正确写法
如果你需要写适配任意类型List的泛型扩展,建议使用常规的泛型参数命名(比如T、E这类不会和内置类型重名的标识符),示例如下:
// 正确的泛型扩展写法,T为泛型参数名 extension MyExtension<T> on List<T> { void myMethod() { // 这里的int就是内置类型,不会冲突 int a = 1; } }
内容的提问来源于stack exchange,提问作者Suragch
相关产品推荐
相关产品推荐

