Nominative类型系统
在Nominative类型系统中,根据类型的名字(或声明)来判断类型等价,所以又叫name-based type system(基于名字的类型系统)。
class ClassA {
int a;
}
class ClassB {
int a;
}
ClassA objA = new ClassA();
ClassB objB = new ClassB();
上面的例子中,objA
和objB
虽然有相同的结构,但是被声明为不同的类型,所以objA
和objB
不能互换。
子类型也一样,要通过显式声明来表明一个类型是另一个类型的子类。
Structural类型系统
结构类型系统中,通过对象的结构来判断等价和子类关系,对象的结构也就是一些属性和方法,只要两个对象有相同的字段,它们的类型就是等价的。对象A包含对象B的属性,那么对象A就是对象B的子类(子类对父类进行扩展,可增加属性)。
我接触过的,也就只有Go的interface了。
Duck typing和结构类型不同,Duck typeing是在运行时进行检测。Duck typing也是一种结构类型,运行时检测也不是必须的
Vinly
Vinly在Haskell里实现了结构类型,以后继续。