加载中...

类型系统判断「两个类型是否兼容」有两种基本准则。名义类型(nominal typing)按声明的名称与显式继承关系判断:Java 中即使两个类成员完全相同,不声明继承或实现关系就互不兼容。结构化类型(structural typing)按成员结构判断:只要形状匹配即可互换使用。
TypeScript 是结构化类型的代表——接口无需显式 implements,对象只要具备所需属性即可赋值;Go 的接口采用隐式实现,也是结构化思想;OCaml 的对象与多态变体同样如此。Java、C#、Rust(trait 需显式 impl)、Swift 则以名义类型为主。
结构化类型解耦声明与使用、利于适配第三方代码,但可能出现「形状恰好相同却语义不同」的误配;名义类型意图明确、便于封装与演进,代价是样板代码较多。可以把结构化类型理解为「编译期检查的鸭子类型」。

登录 后参与讨论
暂无讨论,来发表第一条评论吧