Dart中能否定义隐式接口?实现非显式实现类的接口兼容
Dart 隐式接口匹配的实现方案
Dart是标称类型系统,不支持原生的隐式接口匹配(即仅通过结构符合就自动适配接口)——类必须显式声明implements接口,才能被接收该接口的函数识别。但可以通过以下两种方式实现类似“隐式适配”的效果:
方法1:泛型函数 + 类型约束(Dart 3.0+)
利用Dart 3.0引入的类型模式约束,直接限定泛型类型必须具备指定的成员,无需定义额外接口:
num sum<T>(T xs) where T : { num operator[](int), int length } { var total = 0.0; for (var i = 0; i < xs.length; i++) { total += xs[i]; } return total; } void main() { final xs = [3, 4, 2, 5]; print(sum(xs)); // 输出 14.0 }
这种方式直接通过结构约束筛选符合条件的类型,List、自定义类等只要具备length属性和索引运算符,都能传入函数。
方法2:Extension 扩展适配
如果使用Dart 3.0以下版本,可以通过扩展将符合结构的类型适配到目标接口,无需修改原类代码:
// 定义目标接口 abstract interface class Indexable { num operator [](int index); int get length; } // 定义通用扩展,适配所有符合结构的类型 extension IndexableAdapter on Object implements Indexable { @override num operator [](int index) => (this as dynamic)[index]; @override int get length => (this as dynamic).length; } num sum(Indexable xs) { var total = 0.0; for (var i = 0; i < xs.length; i++) { total += xs[i]; } return total; } void main() { final xs = [3, 4, 2, 5]; print(sum(xs)); // 输出 14.0 }
如果需要更安全的适配,可以针对特定类型(比如List<num>)单独编写扩展,避免dynamic带来的类型风险。
核心结论
Dart本身不支持结构类型的隐式接口匹配,但通过泛型约束或扩展机制,可以实现类似效果,让未显式实现接口但结构符合的对象被函数接收。
内容的提问来源于stack exchange,提问作者Richard Ambler
相关产品推荐
相关产品推荐

