Dart泛型:如何约束类型T具备指定属性?
解决Dart泛型中约束类型具备指定属性的问题
要让泛型类型<T>确保具备某个属性,你需要给泛型添加类型约束——通过定义一个包含目标属性的抽象类(或接口),让<T>继承/实现这个类型,这样Dart就能确定T必然包含该属性。
具体步骤:
定义约束类型
先创建一个抽象类(或普通类、接口),明确声明需要的id属性:abstract class HasId { int? get id; // 匹配你代码里的`element.id!`,设为可空int }如果你的场景中
id是不可空的,直接写成int get id;即可。给泛型添加约束
修改Foo类的泛型声明,让T必须继承HasId:class Foo<T extends HasId> { List<T> items = []; removeById(int id) { items.removeWhere((T element) => element.id! == id); // 现在不会报错 } }让实际类型符合约束
当你使用Foo时,传入的类型必须实现HasId接口:class User implements HasId { @override final int? id; String name; User(this.id, this.name); } // 使用示例 void main() { final foo = Foo<User>(); foo.items.add(User(1, "Alice")); foo.removeById(1); }
原理说明
泛型默认没有约束时,Dart只会把T当成最基础的Object类型,而Object并没有id属性,所以会报错。通过T extends HasId,你告诉Dart:所有传入Foo的T类型,都肯定具备HasId中定义的id属性,这样就能安全访问element.id了。
内容的提问来源于stack exchange,提问作者enchance
相关产品推荐
相关产品推荐

