协变返回类型
java编程思想中的解释:java SE5(JDK 1.5)中添加了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
上述的解释比较难以理解,那我直接用大白话描述一下:子类重写父类(或者是实现的接口)中的方法时,方法的返回值类型可以是被重写的方法返回类型的子类实现,代码演示:
public class Test {
public static void main(String[] args) {
Consumer consumer = new ConsumerImpl();
// 控制台输出"woman eat"
consumer.getPerson().eat();
}
}
interface Person{
void eat();
}
class Man implements Person{
@Override
public void eat() {
System.out.println("man eat");
}
}
class Woman implements Person{
@Override
public void eat() {
System.out.println("woman eat");
}
}
interface Consumer{
Person getPerson();
}
class ConsumerImpl implements Consumer{
@Override
public Woman getPerson() {
return new Woman();
}
}
看完代码再来看上面那句话,现在就比较好理解了,接口Consumer
中的getPerson()
方法返回值是Person
,Person
也是一个接口;ConsumerImpl
实现了Consumer
并重写getPerson()
方法,并将返回值设为Woman
,因为Man
和Woman
是Person
的实现类,所以根据里氏替换原则,父类可以被子类所替换,因此ConsumerImpl
实现后的getPerson()
方法的返回值可以设定为Person
以及Person
的实现子类(Man
和Woman
)。
什么是协变返回类型?
答:子类重写父类(或者是实现的接口)中的方法时,方法的返回值类型可以是被重写的方法返回类型的子类实现