一个类型可以有多个子类型。
子类型创建规则
1. 子类型可以增加方法,但不可以删除方法;
2. 子类型需要实现抽象类型中的所有未实现方法;
3. 子类型中重写的方法必须有与父类型或子类型相同的返回值;
4. 子类型中重写的方法必须使用同样类型的参数;
5. 子类型中重写的方法不能抛出额外的异常。
LSP
1. 前置条件不能强化;
2. 后置条件不能弱化;
3. 不变量要保持;
4. 子类型方法参数:逆变;
5. 子类型方法返回值:协变;
6. 异常类型:协变。
协变
父类型→子类型,spec越来越具体。
返回值类型和异常类型:不变或更具体。
例如:
class T {
Object a() {......}
void b() throws Throwable {......}
}
class S extends T {
@Override
String a() {......} //更具体的返回值类型
@Override
void b() throws IOException {......} //更具体的异常类型
}
class U extends T {
@Override //子类型中的异常应该是父类型中某异常的子类型
void b() {......}
}
逆变
父类型→子类型,spec越来越具体。
参数类型:不变或更抽象。
class T {
void c(String s) {......}
}
class S extends T {
@Override
void c(Object s) {......} //更抽象的参数类型
}