我刚刚遇到了"Java子类型"和"真子类型"这两个词汇。在一个问题中,清楚地表明它们不是相同的概念。但我找不到关于这两者之间有何区别的解释。
请问有人能够解释一下"Java子类型"和"真子类型"之间的区别吗?
http://www.cs.washington.edu/education/courses/cse331/10au/lectures/subtypingexamples.pdf
该链接包含一个非常有启发性的例子。假设你有一个存储值x和y的Point2D类。现在你可以创建一个子类型Point3D并添加一个值z。如果你不重写任何方法,并小心处理equals和hashcode方法,你可以随时用Point3D实例替换Point2D实例。class Point2D {
int x;
int y;
}
//true subtype
class Point3D extends Point2D {
int z;
}
如果你有一个人类(Person)的类,然后又有两个子类型:员工(Employee)和客户(Customer),那么就会出现一个更复杂的例子。员工和客户都提供与人类相同的字段和方法。
class Person {
String name;
Date birthday;
@Override
public boolean equals(Object o){
//simplified equals implementation, this does not fulfill equals contract!
return name.equals(((Person)o).name);
}
}
//true subtype, same behaviour
class Employee extends Person {
long departmentId;
}
//not a true subtype, different behaviour -> equals
class Customer extends Person {
long customerId;
Date lastContact;
String city;
public boolean equals(Object o){
//simplified equals implementation, this does not fulfill equals contract!
return customerId.equals(((Customer)o).customerId);
}
}
在这里,即使类 Human 没有使用 extends 或 implements 关键字,它仍然具有类 Vertebrate 相似的行为。这被称为真子类型。而类 Squid 使用 extends 关键字扩展类 Vertebrate,这被称为Java子类型。